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 jestalled:
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.
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'