Kreator poleceń grep i ripgrep
Twórz wyszukiwania grep i ripgrep z uwzględnianiem, wykluczaniem i kontekstem.
O tym narzędziu
Ustaw wzorzec, miejsce wyszukiwania, pliki i foldery do uwzględnienia lub pominięcia oraz to, co ma być pokazane (linie z kontekstem, same dopasowania, liczniki lub nazwy plików). Otrzymasz odpowiednie polecenia GNU grep i ripgrep z wyjaśnieniem każdej flagi i przetestujesz wzorzec na przykładowym tekście bezpośrednio na stronie.
Jak z tego korzystać
- Wpisz, czego szukać. Kilka linii to kilka wzorców; wystarczy, że pasuje dowolny z nich.
- Wybierz składnię regex, podstawową, zwykły tekst lub Perl oraz opcje, np. ignorowanie wielkości liter lub całe słowa.
- Ustaw, gdzie szukać i które pliki oraz foldery uwzględnić lub pominąć.
- Wybierz, co pokazać, przetestuj wzorzec na przykładowym tekście, a potem skopiuj polecenie grep lub ripgrep.
Pytania
- Jak przeszukiwać rekurencyjnie, ale pominąć niektóre foldery?
- Dodaj --exclude-dir dla każdego folderu, np. grep -r --exclude-dir=.git --exclude-dir=vendor pattern . W ripgrep wszystko, co jest w .gitignore, jest pomijane automatycznie, a -g '!folder/' pomija kolejne foldery.
- Jak przeszukiwać tylko pliki określonego typu?
- W grep dodaj --include='*.log' (w cudzysłowie, aby powłoka nie rozwinęła gwiazdki). W ripgrep użyj -g '*.log' albo wbudowanego typu, np. -t py lub -t java.
- Czym różni się grep -E od zwykłego grep?
- Zwykły grep używa podstawowych wyrażeń regularnych, w których + ? | ( ) są zwykłymi znakami, chyba że poprzedzisz je ukośnikiem wstecznym. -E przełącza na składnię rozszerzoną, w której działają jako operatory, tak jak w większości języków programowania.
- Wybrać grep czy ripgrep?
- ripgrep (rg) jest znacznie szybszy w dużych projektach, domyślnie przeszukuje rekurencyjnie i respektuje .gitignore. grep jest zainstalowany w każdym systemie uniksowym, co ma znaczenie na serwerach i w skryptach.
- Jak pokazać linie wokół każdego dopasowania?
- Użyj -C 3, aby uzyskać trzy linie kontekstu z obu stron, albo -B i -A, aby ustawić osobno linie przed i po. Podgląd pokazuje te same linie kontekstu.
- Jak wyszukać grepem wzorzec zaczynający się od myślnika?
- grep odczytałby go jako opcję. Poprzedź go -e, jak w grep -e "-v" notes.txt, albo zakończ opcje dwoma myślnikami: grep -- "-v" notes.txt. Narzędzie automatycznie dodaje -e, gdy wzorzec zaczyna się od myślnika.
- Jak przeszukać skompresowane pliki logów .gz?
- Zwykły grep widzi tylko skompresowane bajty, dlatego *.gz jest tu domyślnie wykluczone. Użyj zgrep, który akceptuje większość opcji grep, np. zgrep -i "timeout" /var/log/app.log.2.gz. Dla całego folderu rotowanych logów zgrep -i timeout /var/log/app.log* przeszukuje razem pliki zwykłe i skompresowane.
- Jak policzyć dopasowania zamiast pasujących linii?
- grep -c liczy linie, więc linia z trzema dopasowaniami liczy się raz. Aby policzyć każde wystąpienie, wypisz każde dopasowanie w osobnej linii i policz te linie: grep -o "error" app.log | wc -l. Jeśli wielkość liter bywa różna, dodaj -i w obu wariantach.
Jak wyszukać grepem kilka słów naraz?
Aby dopasować linie zawierające którekolwiek z kilku słów, użyj składni rozszerzonej: grep -E "error|warn" app.log. To samo działa z osobnym -e dla każdego wzorca, grep -e error -e warn app.log, i właśnie to dostajesz tutaj, gdy wpiszesz każdy wzorzec w osobnej linii. W składni podstawowej trzeba by napisać error\|warn, a to rozszerzenie GNU, którego grep z BSD na macOS może nie akceptować.
grep nie ma operatora AND. Aby znaleźć linie zawierające oba słowa w dowolnej kolejności, przekaż wynik jednego wyszukiwania do drugiego: grep -i payment app.log | grep -i timeout. W GNU grep -P obsługuje lookaheady, jak w grep -P "^(?=.*payment)(?=.*timeout)", ale w domyślnym grepie na macOS -P nie ma. Aby znaleźć pliki, a nie linie, zawierające oba słowa, połącz grep -rl z xargs.
Dlaczego grep nic nie znajduje?
Najpierw sprawdź cudzysłowy. Bez nich powłoka rozwija * i $, zanim grep zobaczy wzorzec, więc zawsze ujmuj go w podwójne cudzysłowy albo w pojedyncze, gdy zawiera $. Potem sprawdź składnię: w zwykłym grepie + ? i | to zwykłe znaki, chyba że dodasz -E. Pamiętaj też, że kropka pasuje do dowolnego znaku, więc dosłownego numeru wersji szukaj przez grep -F "1.2.3".
Pliki z windowsowymi zakończeniami linii psują wzorce zakotwiczone przez $, bo każda linia kończy się niewidocznym znakiem powrotu karetki. Dopasuj go przez grep -P "foo\r?$" albo najpierw przekonwertuj plik poleceniem dos2unix. Jeśli grep wypisze „binary file matches”, znalazł bajt NUL; dodaj -a, aby przeszukać plik jako tekst. Przetestuj wzorzec na przykładowym tekście tutaj albo w narzędziu Tester wyrażeń regularnych, zanim uruchomisz go na prawdziwych plikach.
Odpowiedniki popularnych flag grep w ripgrep
Większość flag jest taka sama w obu narzędziach: -i, -w, -v, -c, -l, -o, -m oraz opcje kontekstu -A, -B i -C. Różnice potrafią zaskoczyć. ripgrep w terminalu domyślnie pokazuje numery linii, więc -N je ukrywa. Aby ukryć nazwy plików, grep używa -h, a ripgrep -I, natomiast w grep -I oznacza pomijanie plików binarnych. Do podążania za dowiązaniami symbolicznymi grep używa -R, a ripgrep -L.
ripgrep przeszukuje rekurencyjnie i pomija ukryte pliki oraz wszystko z .gitignore, a --hidden i --no-ignore to wyłączają. Zamiast --include i --exclude ma jedną flagę: rg -g "*.py" TODO przeszukuje tylko pliki Pythona, a glob zaczynający się od ! wyklucza pliki. Wygenerowane polecenie ujmuje go w pojedyncze cudzysłowy, aby bash nie traktował ! jako odwołania do historii. Z -S, czyli smart case, wzorzec pisany małymi literami ignoruje wielkość liter, a wzorzec z wielkimi literami nie. grep nie ma smart case, więc polecenie grep używa zamiast tego -i.
Coś nie działa albo wynik wygląda na błędny? Zgłoś problem z tym narzędziem