Grep

Wstęp

Niejednokrotnie zdarza się, że przeglądając różne pliki, czy wykonując rozmaite polecenia, na ekranie konsoli pojawia się wynik w postaci długiego bloku tekstu. Często interesują nas konkretne informacje zawarte w tym tekście. Dla przykładu, powiedzmy że przeglądamy logi systemu. Chcemy zobaczyć, kiedy logował się użytkownik blackbat. Najłatwiej byłoby więc przeszukać plik w poszukiwaniu wspomnianego użytkownika. Takie przeszukiwanie umożliwia nam polecenie grep (ang. Globally search for Regular Expression and Print out).

Podstawowe opcje

Jak większość poleceń, także grep posiada wiele przydatnych opcji. Poniżej omówimy kilka z nich.

Numery linii: -n

W celu łatwiejszego przeglądania i analizowania wyjścia, jakie wyprodukuje grep, możemy włączyć wyświetlanie numerów linii za pomocą opcji -n.

Składnia

grep -n
grep --line-number

Zliczanie pasujących wyników: -c

Nie zawsze interesują nas linie zawierające dany fragment, czasem chcemy po prostu wiedzieć, ile ich jest. W tym celu przydatna będzie opcja -c.

Składnia

grep -c
grep --count

Odwrócenie dopasowania: -v

Czasem potrzebujemy znaleźć linie, w których zadany fragment nie występuje. W tym celu możemy skorzystać z opcji, która odwraca wyszukiwanie: -v.

Składnia

grep -v
grep --invert-match

Ignorowanie wielkości liter: -i

Jak to mówią, rozmiar nie ma znaczenia. Możemy tę myśl przekazać także do polecenia grep za pomocą opcji -i.

Składnia

grep -i
grep --ignore-case

Dopasowanie pełnych wyrazów: -w

Jeżeli chcemy dopasować jedynie pełne wyrazy, a nie ich fragmenty, możemy skorzystać z opcji -w.

Składnia

grep -w
grep --word-regexp

Wypisywanie tylko dopasowania: -o

Aby wyświetlić jedynie dopasowane fragmenty, a nie całe linie, użyjemy opcji -o.

Składnia

grep -o
grep --only-matching

Wypisanie wcześniejszych linii: -B

Czasem potrzebujemy zobaczyć nie tylko linię z dopasowanym tekstem, ale także klika wcześniejszych. Możemy to zrobić za pomocą opcji -B.

Składnia

grep -B <liczba>
grep --before-context <liczba>

Wypisanie kolejnych linii: -A

Czasem potrzebujemy zobaczyć nie tylko linię z dopasowanym tekstem, ale także klika kolejnych. Możemy to zrobić za pomocą opcji -A.

Składnia

grep -A <liczba>
grep --after-context <liczba>

Wyrażenia regularne

Wyszukiwanie za pomocą fragmentu tekstu ma swoje ograniczenia. Nie zawsze chcemy wyszukać konkretny tekst, czasem chcemy znaleźć wystąpienia zadanego formatu. Załóżmy, że przeglądając logi systemowe chcemy znaleźć wszystkie linie zawierające znacznik czasowy w formacie hh:mm:ss. Nie interesuje nas konkretny czas, ale sam fakt występowania jakiegoś czasu w danej linii. Takie dopasowanie możemy uzyskać za pomocą wyrażeń regularnych.
Przedstawimy teraz kilka przydatnych wzorców dopasowań.

Początek linii: ^

Jeżeli szukamy linii, które zaczynają się od zadanego wzorca, możemy skorzystać z symbolu ^.

Przykład

^start

Koniec linii: $

Jeżeli szukamy linii, które kończą się zadanym wzorcem, możemy skorzystać z symbolu $.

Przykład

start$

Dopasowanie dowolnego znaku: .

W celu dopasowania dowolnego znaku w zadanym miejscu wzorca, użyjemy znaku kropki.

Powtarzanie wzorca zero lub więcej razy: *

Za pomocą symbolu gwiazdki możemy określić, że występujący przed nią fragment wzorca powinien wystąpić zero lub więcej razy. Fragmenty wzorca możemy otaczać nawiasami okrągłymi, żeby uwzględnić większy fragment niż tylko pojedynczy znak.

Dopasowanie do zbioru znaków: []

Używając notacji nawiasów kwadratowych możemy określić, jakie znaki mogą zostać dopasowane w zadanym miejscu. Dla przykładu, jeżeli chcielibyśmy dopasować jedynie litery a lub b to użylibyśmy wyrażenia [ab].

Wykluczenie znaków z dopasowania: [^]

Możemy także wykluczyć zadane znaki z dopasowania w konkretnym miejscu wzorca używając nawiasów kwadratowych i znaku ^. Dla przykładu, jeżeli chcielibyśmy dopasować wszystkie znaki poza a i b zapisalibyśmy [^ab].

Dopasowanie znaków z przedziału

Używając nawiasów kwadratowych możemy także określić przedział dopuszczalnych znaków. Dla przykładu, jeżeli chcielibyśmy dopasować tylko cyfry, napisalibyśmy [0-9].