Narzędzia linuksowe mają to do siebie, że można je wykorzystać na wiele różnych sposobów. Najczęściej jednak sposoby te są głęboko ukryte za wyjaśnieniami poszczególnych przełączników i ich potencjalnych wartości. W dzisiejszym wpisie chciałbym pokazać jedną ciekawą sztuczkę dotyczącą szeroko używanego narzędzia do wyszukiwania informacji w plikach - grep.

Grep: global / regular expression / print.

Program grep jest jednym z najbardziej przydatnych narzędzi dostępnych w ramach systemów zgodnych ze standardem POSIX. Podczas operacji w “czarnym ekranie” nierzadko musimy zlokalizować pewną wartość w pliku, np. wartość pewnej zmiennej w pliku konfiguracyjnym. Przykładem może być opisywana przeze mnie właściwość short_open_tag w pliku php.ini:

grep 'short_open_tag' php.ini

Wynik [2 linijki pasują do wyrażenia]:

short_open_tag
short_open_tag = Off

Jest to moim zdaniem najprostszy sposób na wykonanie tego typu zadań. Przy okazji - posiada on poza tym wiele innych możliwości - polecam zagłębienie się w lekturę manuala tego programu.

Grep: wyświetlanie linii otaczających znalezione wyniki.

Gdy wywołamy program grep bez dodatkowych modyfikatorów, wyświetli on wszystkie linie, które udało mu się dopasować do podanego wzorca. Czasem jednak potrzebujemy informacji znajdujących się w pewnym otoczeniu znalezionego wyniku, np. opisu danej zmiennej z pliku konfiguracyjnego. Twórcy narzędzia podeszli do sprawy w pełni profesjonalnie, zapewniając nam wszystkie trzy możliwości wyświetlania tych danych:
  • linie znajdujące się przed wynikiem, modyfikator -B
  • linie znajdujące się po wyniku, modyfikator -A
  • linie znajdujące się po obu stronach wyniku, modyfikator -C
Sprawdźmy więc, jak działają w praktyce [w wynikach, linijka “–” oznacza kolejny znaleziony fragment, w tym przypadku zostały znalezione dwa]:

Wyświetlanie 5 linii znajdujących się przed znalezionym wynikiem:

grep -B 5 'short_open_tag' php.ini
; session.hash_bits_per_character
;   Default Value: 4
;   Development Value: 5
;   Production Value: 5

; short_open_tag
--
; supported for backwards compatibility, but we recommend you don't use them.
; Default Value: On
; Development Value: Off
; Production Value: Off
; http://php.net/short-open-tag
short_open_tag = Off

Wyświetlanie 5 linii znajdujących się przed znalezionym wynikiem:

grep -A 5 'short_open_tag' php.ini
; short_open_tag
;   Default Value: On
;   Development Value: Off
;   Production Value: Off

; track_errors
--
short_open_tag = Off

; Allow ASP-style <% %> tags.
; http://php.net/asp-tags
asp_tags = Off

Wyświetlanie 5 linii znajdujących się przed znalezionym wynikiem:

grep -C 5 'short_open_tag' php.ini
; session.hash_bits_per_character
;   Default Value: 4
;   Development Value: 5
;   Production Value: 5

; short_open_tag
;   Default Value: On
;   Development Value: Off
;   Production Value: Off

; track_errors
--
; supported for backwards compatibility, but we recommend you don't use them.
; Default Value: On
; Development Value: Off
; Production Value: Off
; http://php.net/short-open-tag
short_open_tag = Off

; Allow ASP-style <% %> tags.
; http://php.net/asp-tags
asp_tags = Off

Jak widać, jest to relatywnie prosty i jednocześnie bardzo efektywny sposób na wyszukiwanie informacji w plikach. Polecam każdemu, kto ma styczność z systemami opartymi na idei Linuksa / Uniksa, ponieważ jest on tam na pewno obecny. Mam nadzieję, że dzisiejszy wpis zapadnie Wam w pamięć, ze względu na to, że czasem prawdopodobnie będziecie próbowali [podobnie jak ja za pierwszym razem ;]] wynajdywać koło na nowo, zamiast spróbować gotowego rozwiązania.

Do zobaczenia w kolejnym wpisie!