GNU/Linux >> Znalost Linux >  >> Linux

Vrátit pouze část řádku po odpovídajícím vzoru?

Otevřete tedy soubor pomocí cat a poté pomocí grep získat odpovídající řádky mě zatím dostane pouze tehdy, když pracuji s konkrétní sadou protokolů, se kterou mám co do činění. Potřebuje způsob, jak spojit čáry se vzorem, ale pouze vrátit část čáry po shodě. Část před a po zápase se bude neustále lišit. Hrál jsem s pomocí sed nebo awk , ale nebyli jsme schopni přijít na to, jak filtrovat řádek, aby se část před zápasem smazala, nebo aby se část po zápase vrátila, buď to bude fungovat.
Toto je příklad řádku, který potřebuji filtrovat:

2011-11-07T05:37:43-08:00 <0.4> isi-udb5-ash4-1(id1) /boot/kernel.amd64/kernel: [gmp_info.c:1758](pid 40370="kt: gmp-drive-updat")(tid=100872) new group: <15,1773>: { 1:0-25,27-34,37-38, 2:0-33,35-36, 3:0-35, 4:0-9,11-14,16-32,34-38, 5:0-35, 6:0-15,17-36, 7:0-16,18-36, 8:0-14,16-32,34-36, 9:0-10,12-36, 10-11:0-35, 12:0-5,7-30,32-35, 13-19:0-35, 20:0,2-35, down: 8:15, soft_failed: 1:27, 8:15, stalled: 12:6,31, 20:1 }

Část, kterou potřebuji, je vše po „zastavení“.

Pozadí za tím je, že mohu zjistit, jak často se něco zastaví:

cat messages | grep stalled | wc -l

Potřebuji zjistit, kolikrát se určitý uzel zablokoval (označeno částí před každým dvojtečkou po „zablokování“. Pokud na to jen šáhnu (tj. 20:), může to vrátit řádky, které mají slabé chyby, ale no stalls, což mi nepomůže. Potřebuji filtrovat pouze zastavenou část, abych pak mohl vyhledat konkrétní uzel z těch, které se zastavily.

Pro všechny záměry a účely se jedná o systém freebsd se standardními nástroji jádra GNU, ale nemohu nainstalovat nic extra, co by mi pomohlo.

Přijatá odpověď:

Kanonický nástroj pro to by byl sed .

sed -n -e 's/^.*stalled: //p'

Podrobné vysvětlení:

  • -n znamená ve výchozím nastavení nic netisknout.
  • -e následuje příkaz sed.
  • s je příkaz nahrazení vzoru.
  • Regulární výraz ^.*stalled: odpovídá vzoru, který hledáte, plus veškerý předchozí text (.* znamená libovolný text s počátečním ^ říci, že zápas začíná na začátku řádku). Všimněte si, že pokud je stalled: se na řádku vyskytuje několikrát, bude to odpovídat poslednímu výskytu.
  • Shoda, tj. vše na řadě až do stalled: , je nahrazeno prázdným řetězcem (tj. smazáno).
  • Konečné p znamená vytisknout transformovaný řádek.

Pokud chcete zachovat odpovídající část, použijte zpětný odkaz:1 v náhradním díle označuje, co je uvnitř skupiny (…) ve vzoru. Zde můžete napsat stalled: opět v náhradním dílu; tato funkce je užitečná, když je hledaný vzor obecnější než jednoduchý řetězec.

sed -n -e 's/^.*(stalled: )/1/p'

Někdy budete chtít odstranit část čáry po zápase. Můžete jej zahrnout do zápasu přidáním .*$ na konci vzoru (libovolný text .* následovaný koncem řádku $ ). Pokud tuto část nevložíte do skupiny, na kterou odkazujete v nahrazujícím textu, konec řádku nebude ve výstupu.

Související:Sed:tisknout pouze první výskyt shody vzoru?

Jako další ilustrace skupin a zpětných referencí tento příkaz zamění část před zápasem a část po zápase.

sed -n -e 's/^(.*)(stalled: )(.*)$/321/p'

Linux
  1. Vložení souboru do jiného souboru po prvním výskytu vzoru?

  2. Ponechat pouze první řádek z každé sekvence po sobě jdoucích řádků, které odpovídají vzoru?

  3. Sed:Vytisknout pouze první výskyt shody vzoru?

  1. Jak spočítat počet řádků v souboru po zápase Grep?

  2. Jaký je celkový součet na prvním řádku po ls -l?

  3. vložit pouze na první zápas

  1. Tisknout odpovídající čáru a N-tou čáru ze shodné čáry?

  2. Koncept 'Hold space' a 'Pattern space' v sed

  3. Příkazový řádek pro návrat do GUI po Ctrl-Alt-F1?