Blog

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臋.