Grep - znalezienie linii ale wy艣wietlenie innej
Naturalnie na linuxie do przeszukiwania plik贸w tekstowych wykorzystuje si臋 polecenie grep. Jestem do niego tak przyzwyczajony, 偶e w sumie korzystam z niego bezwiednie. Nies艂usznie, poniewa偶 ma troch臋 ciekawy funkcji do zaproponowania.
Przeszukiwa艂em ostatnio logi aplikacji, w kt贸rych wpis sk艂ada si臋 z trzech linii, wi臋c w wynikach potrzebowa艂em wy艣wietli膰 inn膮 lini臋 ni偶 ta kt贸ra pasowa艂a do wyra偶enia regularnego. Normalnie, to napisa艂bym szybki skrypt bashowy, kt贸ry mi obs艂u偶y ten przypadek, ale wiedziony na stackoverflow - a jak偶e - trafi艂em na proste i skuteczne rozwi膮zanie.
Grep posiada flagi kontekstowe linii, takie jak:
-A NUM, --after-context=NUM Print NUM lines of trailing context after matching lines. Places a line containing a group separator (--) between contiguous groups of matches. With the -o or --only-matching option, this has no effect and a warning is given. -B NUM, --before-context=NUM Print NUM lines of leading context before matching lines. Places a line containing a group separator (--) between contiguous groups of matches. With the -o or --only-matching option, this has no effect and a warning is given. -C NUM, -NUM, --context=NUM Print NUM lines of output context. Places a line containing a group separator (--) between contiguous groups of matches. With the -o or --only-matching option, this has no effect and a warning is given.
Ka偶dy z parametr贸w oddziela wyniki podw贸jnym my艣linikiem.
Jako, 偶e jeden obraz to tysi膮c s艂贸w, przejd藕my do prostych przyk艂ad贸w.
Dla przyk艂adowego pliku
2021-12-01 line A 1 line A 2 line A 3 2021-12-01 line B 1 line B 2 line B 3 2021-12-02 line C 1 line C 2 line C 3 2021-12-02 line D 1 line D 2 line D 3
T艂umacz臋 i obja艣niam
Przypadek pierwszy z parametrem A: interesuje Nas zawarto艣膰 drugiej linii po dacie 2 grudnia, czyli
$grep 12-02 -A2 grep.txt 2021-12-02 line C 1 line C 2 -- 2021-12-02 line D 1 line D 2
Przypadek drugi z parameterm B: interesuje Nas zawarto艣膰 linii o jedn膮 wy偶ej przed lini膮 zawieraj膮ca cyfr臋 "2"
$ grep 'line.*2' -B1 grep.txt line A 1 line A 2 -- line B 1 line B 2 -- line C 1 line C 2 -- line D 1 line D 2
Przypadek trzeci z parametrem C: 艂膮czy parameter A i B i wy艣wietla zawarto艣膰 linii przed i po o podan膮 wielko艣膰. Uwaga, je偶eli wyniki nak艂adaj膮 si臋 na siebie to linie si臋 nie dubluj膮, czyli
$ grep 'line.*2' -C2 grep.txt 2021-12-01 line A 1 line A 2 line A 3 2021-12-01 line B 1 line B 2 line B 3 2021-12-02 line C 1 line C 2 line C 3 2021-12-02 line D 1 line D 2 line D 3
Wy艣wietli ca艂y plik - bez separator贸w - poniewa偶 po dwie linie w d贸艂 i w g贸r臋 od wynik贸w nie ma nic ponad to co wida膰.
Dzi臋kuj臋 za uwag臋.