Przejdź do pierwszej, poprzedniej, następnej, ostatniej sekcji, spisu treści.


6. Sposób użycia

Oto przykładowe polecenie powłoki wywołujące GNU grep:

grep -i 'hello.*world' menu.h main.c

Pokazuje ono wszystkie linie plików `menu.h' i `main.c' zawierające łańcuch `hello', po którym występuje łańcuch `world'; dzieje się tak, gdyż `.*' dopasowuje zero lub więcej znaków linii. Zob. 5. Wyrażenia regularne. Opcja `-i' powoduje, że grep będzie ignorować wielkość liter, dopasowując np. linię `Hello, world!', która w przeciwnym razie nie zostałaby dopasowana. Zob. 2. Wywołanie grep, gdzie szczegółowo omówiono sposób wywołania grep.

Oto kilka częstych pytań na temat korzystania z grep i odpowiedzi na nie.

  1. Jak uzyskać zestawienie tylko nazw pasujących plików?
    grep -l 'main' *.c
    
    podaje nazwy wszystkich plików C z bieżącego katalogu, których zawartość wzmiankuje `main'.
  2. Jak rekurencyjnie przeszukać katalogi?
    grep -r 'hello' /home/gigi
    
    szuka `hello' we wszystkich plikach pod katalogiem `/home/gigi'. Lepszą kontrolę nad tym, jakie pliki mają być przeszukiwane można uzyskać stosując find, grep i xargs. Na przykład, poniższe polecenie przeszukuje tylko pliki C:
    find /home/gigi -name '*.c' -print | xargs grep 'hello' /dev/null
    
  3. Co jeśli wzorzec zaczyna się od `-'?
    grep -e '--cut here--' *
    
    szuka wszystkich linii pasujących do `--cut here--'. Bez `-e', grep próbowałby analizować `--cut here--' jako listę opcji.
  4. Załóżmy, że szukamy całego wyrazu, a nie jego części?
    grep -w 'hello' *
    
    szuka tylko tych wystąpień `hello', które są całymi wyrazami; nie dopasuje `Othello'. Dokładniejszą kontrolę można uzyskać stosując `\<' i `\>' do dopasowania początku i końca wyrazów. Na przykład:
    grep 'hello\>' *
    
    wyszukuje tylko wyrazy kończące się na `hello', zatem dopasuje wyraz `Othello'.
  5. Jak wypisać linie sąsiadujące z pasującymi?
    grep -C 2 'hello' *
    
    wypisuje dwie linie kontekstu wokół każdej z dopasowanych linii.
  6. Jak wymusić na grep wypisanie nazwy pliku? Dodać na końcu `/dev/null':
    grep 'eli' /etc/passwd /dev/null
    
  7. Czemu ludzie używają dziwnych wyrażeń regularnych z wyjściem z ps?
    ps -ef | grep '[c]ron'
    
    Jeśli wzorzec zostałby zapisany bez nawiasów kwadratowych, dopasowałby nie tylko linię wyjściową z ps dotyczącą cron, ale i linię wyjściową ps dla samego grep.
  8. Dlaczego grep zgłasza "Binary file matches"? Gdyby grep podał wszystkie pasujące "linie" pliku binarnego, utworzony wynik nie byłby prawdopodobnie do niczego przydatny, a nawet mógłby nabałaganić na ekranie. Zatem GNU grep wyłącza wypisywanie dla plików, które wyglądają na binarne. Możemy zmusić go do wypisywania dopasowanych linii również dla takich plików stosując opcję `-a' lub `--binary-files=text'. Chcąc się pozbyć komunikatów "Binary file matches" ("Plik binarny pasuje do wzorca") należy skorzystać z opcji `-I' lub `--binary-files=without-match'.
  9. Dlaczego `grep -lv' nie wypisuje nazw plików niepasujących? `grep -lv' wypisuje nazwy wszystkich plików zawierających co najmniej jedną niepasującą linię. Do uzyskania listy nazw wszystkich plików nie zawierających żadnych pasujących linii, należy użyć opcji `-L' lub `--files-without-match'.
  10. Logiczne OR można uzyskać dzięki `|', ale co z AND?
    grep 'paul' /etc/motd | grep 'franc,ois'
    
    znajdzie wszystkie linie zawierające zarówno `paul', jak i `franc,ois'.
  11. Jak można przeszukać równocześnie standardowe wejście i pliki? Trzeba zastosować specjalną nazwę pliku `-':
    cat /etc/passwd | grep 'alain' - /etc/motd
    


Przejdź do pierwszej, poprzedniej, następnej, ostatniej sekcji, spisu treści.