Więc pociągnięcie do otwarcia pliku za pomocą, cat
a następnie użycie grep
do uzyskania pasujących linii prowadzi mnie tylko do tej pory, gdy pracuję z określonym zestawem dzienników, z którym mam do czynienia. Potrzebuje sposobu, aby dopasować linie do wzoru, ale tylko zwrócić część linii po dopasowaniu. Część przed i po meczu będzie się stale różnić. Grałem przy użyciu sed
lub awk
, ale nie byłem w stanie dowiedzieć się, jak filtrować wiersz, aby usunąć część przed meczem lub po prostu zwrócić część po meczu, albo zadziała. To jest przykład linii, którą muszę filtrować:
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 }
Porcja, której potrzebuję, to wszystko po „utknięciu w martwym punkcie”.
Tłem tego jest to, że mogę dowiedzieć się, jak często coś się zatrzymuje:
cat messages | grep stalled | wc -l
Muszę dowiedzieć się, ile razy jakiś węzeł utknął (wskazany przez część przed każdym dwukropkiem po „utknięciu w martwym punkcie”). Jeśli po prostu grepuję za to (tj. 20 :), może zwrócić linie, które mają soft, ale zawodzą, ale żadnych przeciągnięć, co mi nie pomaga. Muszę odfiltrować tylko zatrzymany odcinek, aby móc grepować dla określonego węzła z zatrzymanych.
Pod każdym względem jest to system freebsd ze standardowymi narzędziami GNU, ale nie mogę zainstalować niczego dodatkowego, aby pomóc.
źródło
sed
rozwiązanie i nie traktuj specjalnie białych znaków.Odpowiedzi:
Kanonicznym narzędziem do tego byłoby
sed
.Szczegółowe wyjaśnienie:
-n
oznacza domyślnie brak drukowania.-e
po nim następuje polecenie sed.s
to polecenie zamiany wzorca.^.*stalled:
pasuje do szukanego wzorca oraz do dowolnego poprzedzającego tekstu (.*
co oznacza dowolny tekst, z inicjałem^
mówiącym, że dopasowanie zaczyna się na początku wiersza). Zauważ, że jeślistalled:
wystąpi kilka razy w linii, będzie pasować do ostatniego wystąpienia.stalled:
, jest zastępowane pustym ciągiem (tzn. Usuwane).p
sposób drukowania przekształconej linii.Jeśli chcesz zachować pasującą część, użyj odnośnika zwrotnego:
\1
w części zamiennej oznacza to, co znajduje się w grupie\(…\)
we wzorcu. Tutaj można napisaćstalled:
ponownie w ramach zastępczej; ta funkcja jest przydatna, gdy szukany wzór jest bardziej ogólny niż zwykły ciąg.Czasami będziesz chciał usunąć fragment linii po meczu. Możesz uwzględnić go w dopasowaniu, umieszczając go
.*$
na końcu wzorca (dowolny tekst,.*
po którym następuje koniec linii$
). O ile nie umieścisz tej części w grupie, do której się odwołujesz w tekście zastępczym, koniec wiersza nie będzie w wyniku.Jako kolejna ilustracja grup i odnośników wstecz, to polecenie zamienia część przed meczem i część po meczu.
źródło
sed … <messages
, ponieważ chcesz przetwarzać dane z pliku. Działać na danych dostarczonych przez innego polecenia, można użyć rury:somecommand | sed …
.sed 's/^.*stalled//'
ponieważ-r
jest on specyficzny dla Linuksa i nie działa na innych systemach, takich jak macOS, a tutaj nie zyskujesz z tego żadnych korzyści.Inne narzędzie kanoniczne, którego już używasz
grep
:Na przykład:
Ma taki sam wynik jak druga opcja Gillesa:
-o
Flag zwraca--only-matching
część wyrażenia, więc nie cała linia jest - oczywiście - zazwyczaj wykonywane przez grep.Aby usunąć „stalled:” z wyjścia, możemy użyć trzeciego narzędzia kanonicznego, wytnij:
cut
Komenda używa ogranicznika:
i drukuje Pole 2 do końca. Oczywiście jest to kwestia preferencji, alecut
składnię, którą uważam za bardzo łatwą do zapamiętania.źródło
-o
opcji! Chciałem zaznaczyć, żegrep
nie rozpoznaje\n
nowego wiersza, więc twój pierwszy przykład pasuje tylko do pierwszegon
znaku. Na przykładecho "Hello Anne" | grep -o 'A[^\n]*'
zwraca ciągA
. Jednakecho "Hello Anne" | grep -o 'A.*'
zwraca oczekiwanyAnne
, ponieważ.
dopasowuje dowolny znak oprócz znaku nowej linii.cut
ogranicznika-d':'
są usuwane przez @poige. Łatwiej zapamiętać z cytatami, np. Z-d' '
lub-d';'
.-f 2
. Poważnie, dlaczego nie?;
zamiast dwukropka:
będzie interpretowany inaczej, jeśli nie będzie cytowany. Oczywiście to logiczne zachowanie, ale nadal lubię polegać na pamięci mięśniowej. Nie lubię cytować ogranicznika raz, ale nie raz. Po prostu osobiste preferencje, jak powiedziałem wcześniej: łatwiej zapamiętać..*
jest potrzebna, działa dobrze dla mnie:cat filename | grep 'Return only this line xyz text' | grep -o 'xyz.*'
powrotyxyz text
Zwykłem
ifconfig | grep eth0 | cut -f3- -d:
to braći spraw, aby wyglądało to tak
źródło
cat /sys/class/net/*/address
, nie wymaga analizy.Jeszcze jedno narzędzie kanoniczne, które rozważałeś,
awk
może być użyte w następującym wierszu:Szczegółowe wyjaśnienie:
-F
definiuje separator dla linii, tzn. „utknął w martwym punkcie”. Wszystko przed separatorem jest adresowane$1
i wszystko po nim$2
./reg-ex/
Wyszukuje pasujące wyrażenie regularne, w tym przypadku „utknął w martwym punkcie”.{print $<n>}
- drukuje n kolumnę. Ponieważ separator jest zdefiniowany jako przeciągnięty, wszystko po zablokowaniu jest uważane za drugą kolumnę.źródło