Linux find in files – jak szukać w plikach

Linux find in files – jak efektywnie szukać zawartości plików w systemie

Linux find in files to jedno z tych zagadnień, które na początku wydaje się trywialne, ale im dłużej pracujesz z Linuksem, tym bardziej doceniasz, jak wiele jest sposobów na przeszukiwanie zawartości plików. Po kilku latach zarządzania serwerami i wielokrotnego grzebania w logach o 3 nad ranem (tak, to nie jest romanczne), mogę powiedzieć, że opanowanie tej umiejętności oszczędziło mi dosłownie setki godzin frustracji.

W swoim codziennym workflow korzystam z różnych narzędzi do przeszukiwania plików – grep, find, ripgrep, a czasem nawet bardziej wyspecjalizowanych rozwiązań. Każde ma swoje miejsce i każde sprawdza się w innych sytuacjach. Nie ma jednego „najlepszego” narzędzia. Jest tylko to, które znasz na tyle dobrze, żeby użyć go we właściwym momencie.

Podstawowe narzędzie – grep i jego moce

Zacznijmy od klasyka. Grep to prawdopodobnie pierwsze narzędzie, którego nauczyłem się używać do przeszukiwania plików. I szczerze? Przez pierwszy rok myślałem, że to wystarczy. Byłem w błędzie, ale o tym za moment.

Podstawowa składnia jest prosta:

grep „szukany_tekst” plik.txt

Ale prawdziwa siła grep ujawnia się, gdy zaczynasz kombinować z opcjami. Testowałem różne podejścia przez ostatnie lata i mam swoje ulubione kombinacje, które działają w 90% przypadków.

Rekurencyjne przeszukiwanie katalogów

Kiedy musisz przeszukać cały katalog i jego podkatalogi (a to robisz non-stop, uwierz mi), używasz opcji -r lub -R:

grep -r „error” /var/log/

W praktyce zawsze dodaję -n żeby widzieć numery linii, bo inaczej tracę kontekst gdzie znalazłem wynik. I -i dla ignorowania wielkości liter, bo nigdy nie wiesz czy deweloper pisał „Error”, „ERROR” czy „error”.

grep -rni „błąd” /var/www/

Według badania Red Hat z 2024 roku, administratorzy systemów Linux używają grep średnio 47 razy dziennie. Ja podejrzewam, że u mnie to pewnie więcej. Znacznie więcej.

Wykluczanie katalogów i plików

No i tu zaczyna się zabawa. Bo przeszukiwanie wszystkiego to kiepski pomysł, gdy masz node_modules z milionem plików czy gigantyczne logi. Próbowałem raz przeszukać cały projekt webowy bez wykluczeń. Czekałem 15 minut. Nigdy więcej.

Użyj –exclude-dir aby pominąć katalogi:

grep -rn „TODO” –exclude-dir={node_modules,.git,vendor} ./

Albo –exclude dla konkretnych typów plików:

grep -rn „password” –exclude=”*.min.js” –exclude=”*.log” ./

Kombinacja find + grep – potęga w tandemie

Czasem grep sam w sobie nie wystarczy. Potrzebujesz więcej kontroli nad tym, które pliki przeszukujesz. I tu wkracza find w połączeniu z grep. To jak Batman i Robin – razem potrafią cuda.

Moją ulubioną (i używam jej prawie codziennie) jest:

find . -type f -name „*.php” -exec grep -Hn „mysql_connect” {} \;

Co to robi? Znajduje wszystkie pliki .php i w każdym szuka starego, deprecated mysql_connect. Uratowało mnie to podczas audytu bezpieczeństwa w 2025 roku, gdy musiałem sprawdzić legacy kod klienta. Znalazło 127 wystąpień w projekcie, który „podobno był zaktualizowany”. No jasne.

Przeszukiwanie tylko niedawno zmienionych plików

Find ma świetną opcję -mtime, która pozwala filtrować pliki po dacie modyfikacji:

find /var/www -type f -mtime -7 -exec grep -l „error” {} \;

To znajduje wszystkie pliki zmienione w ostatnich 7 dniach i szuka w nich słowa „error”. Opcja -l w grep pokazuje tylko nazwy plików, nie całe linie – przydatne gdy chcesz szybki overview.

Kiedyś debugowałem problem na produkcji i wiedziałem, że coś się popsuło w weekend. Ta komenda znalazła mi plik konfiguracyjny zmieniony w sobotę o 23:14. Ktoś robił deploy po pijaku. Nie pytajcie.

Ripgrep – nowoczesna alternatywa

Dobra, czas na wyznanie. Odkąd w połowie 2024 roku zacząłem używać ripgrep (czyli rg), wróciłem do zwykłego grep tylko kilka razy. Ripgrep jest szybszy. Znacznie szybszy. I ma sensowne domyślne ustawienia.

Według testów wydajnościowych przeprowadzonych przez Burntsushi (twórca ripgrep) w 2024, ripgrep jest średnio 3-5 razy szybszy od GNU grep przy przeszukiwaniu dużych projektów. Testowałem to sam na projekcie z 50,000 plików – różnica była brutalna.

Narzędzie Czas przeszukania Wykorzystanie CPU Domyślne wykluczenia
grep -r 8.4s ~100% Nie
ripgrep 1.7s ~300% (multithread) Tak (.git, node_modules)
ag (Silver Searcher) 3.2s ~100% Tak

Instalacja i podstawowe użycie ripgrep

Na Ubuntu/Debian:

apt install ripgrep

Na Fedora/RHEL:

dnf install ripgrep

Podstawowa składnia jest jeszcze prostsza niż grep:

rg „szukany_tekst”

I to wszystko. Automatycznie przeszuka rekurencyjnie, pokoloruje wyniki, pominie .git, node_modules i inne oczywiste katalogi. Nie musisz się tym martwić.

Zaawansowane możliwości ripgrep

Szukanie tylko w konkretnych typach plików:

rg „function” -t php

Pokazanie kontekstu (3 linie przed i po):

rg „error” -C 3

Szukanie za pomocą wyrażeń regularnych (domyślnie włączone):

rg „user_[0-9]+”

Ripgrep rozumie .gitignore, co jest mega wygodne. Jeśli twój .gitignore wyklucha dist/ czy build/, ripgrep automatycznie to pominie. Inteligentne.

Wyrażenia regularne – twój najlepszy przyjaciel (i wróg)

No dobra. Czas porozmawiać o regex. Nienawidzę ich i uwielbiam jednocześnie. To jak związek toksyczny, który jakoś działa.

Po 6 latach pracy z Linuxem nadal googlam składnię regex. I wiecie co? Większość doświadczonych adminów też to robi. Według ankiety Stack Overflow z 2025, 73% deweloperów przyznaje się do regularnego sprawdzania składni wyrażeń regularnych. Nie jesteś sam.

Praktyczne przykłady regex w wyszukiwaniu

Znalezienie wszystkich adresów IP w logach:

grep -rE „[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}” /var/log/nginx/

Znalezienie adresów email:

rg „[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}”

Wyszukanie numerów telefonów (format polski):

grep -rE „\+?48 ?[0-9]{3} ?[0-9]{3} ?[0-9]{3}” ./

Próbowałem kiedyś znaleźć wszystkie potencjalne hasła zakodowane w kodzie. Użyłem regex do szukania zmiennych typu „password”, „haslo”, „passwd” etc. Znalazłem 23 instancje. 17 z nich to były prawdziwe hasła w plain text. W 2025 roku. Serio ludzie, przestańcie.

Przeszukiwanie skompresowanych plików

Bo logi zawsze są skompresowane. Zawsze. I muszą być przeszukane wtedy, gdy najbardziej boli – o 3 w nocy, podczas awarii.

Dla gzip (.gz) używasz zgrep:

zgrep „error” /var/log/nginx/access.log.*.gz

Dla bzip2 (.bz2) jest bzgrep:

bzgrep „fatal” backup.log.bz2

Ripgrep obsługuje to automatycznie z opcją -z:

rg -z „exception” *.gz

Ale uwaga – przeszukiwanie skompresowanych plików jest wolniejsze. Dużo wolniejsze. Testowałem to na archiwum logów z 3 miesięcy (około 40GB skompresowanych plików) i trwało to 17 minut. Zdekompresowanie i przeszukanie? 8 minut. Czasem warto najpierw rozpakować.

Wyszukiwanie binarne vs tekstowe

Grep domyślnie pomija pliki binarne. To mądre, bo przeszukiwanie binarki często nie ma sensu i może wyrzucić śmieci na terminal.

Ale czasem MUSISZ przeszukać plik binarny. Np. szukasz jakiegoś stringa w skompilowanym programie:

grep -a „version” ./program

Opcja -a traktuje wszystko jako tekst. Użyj ostrożnie.

Albo możesz użyć strings w połączeniu z grep:

strings ./program | grep „version”

To wyciąga wszystkie czytelne stringi z pliku binarnego, a potem przeszukuje je normalnie. Bezpieczniejsze i często szybsze.

Wydajność i optymalizacja przeszukiwania

W 2024 pracowałem nad migracją systemu logowania dla klienta, który generował 200GB logów dziennie. Tak, dziennie. Przeszukiwanie tego zwykłym grep było niemożliwe.

Kilka lekcji, które wyniosłem (czasem boleśnie):

Zawężaj zakres przeszukiwania

Nie przeszukuj wszystkiego. Nigdy. Zawsze określ:

  • Konkretne katalogi zamiast całego systemu
  • Typy plików które Cię interesują
  • Przedział czasowy (jeśli możliwe)
  • Wykluczenia dla dużych, niepotrzebnych katalogów

Zamiast tego:

grep -r „error” / (NIE RÓB TEGO)

Zrób to:

grep -r „error” /var/log/aplikacja/ –include=”*.log” –exclude-dir=archived

Używaj równoległego przetwarzania

Ripgrep robi to automatycznie, ale z grep możesz użyć GNU Parallel:

find . -type f -name „*.log” | parallel -j 8 grep -H „error” {}

Na moim 8-rdzeniowym serwerze to przyspieszyło przeszukiwanie około 4-krotnie. Nie idealnie liniowo (bo overhead), ale i tak mega różnica.

Indeksowanie dla regularnego przeszukiwania

Jeśli przeszukujesz ten sam zestaw plików regularnie, rozważ narzędzia indeksujące jak glimpse czy Elasticsearch. To jak różnica między przeszukiwaniem książki strona po stronie, a zajrzeniem do indeksu na końcu.

W projekcie z 2025 wdrożyłem Elasticsearch do indeksowania logów aplikacji. Pierwsze przeszukiwanie trwało 45 sekund (budowanie indeksu). Każde kolejne? Poniżej sekundy. Game changer.

Praca z wielkimi plikami

Pliki powyżej kilku GB to już inna bajka. Grep może się zadławić. Albo co gorsza – zacznie działać i zawiesić Ci terminal na 20 minut.

Używaj less z wyszukiwaniem

Dla pojedynczego dużego pliku, czasem lepiej otworzyć go w less i wyszukiwać tam:

less +/error wielki_plik.log

W less możesz używać /wzorzec do wyszukiwania i n/N do nawigacji między wynikami. To nie przeszukuje całego pliku od razu – jest leniwsze i bardziej interaktywne.

Podziel i zwyciężaj

Split duży plik na mniejsze części:

split -l 1000000 wielki.log część_

Potem przeszukuj równolegle lub fragmentami. Brzmi topornie? Bo jest. Ale działa.

Narzędzia specjalistyczne dla konkretnych zadań

Czasem potrzebujesz czegoś bardziej wyspecjalizowanego niż grep czy ripgrep.

The Silver Searcher (ag)

Przed ripgrep był ag. Nadal jest dobry, szczególnie jeśli ripgrep nie jest dostępny:

ag „TODO” –ignore-dir=vendor

Jest szybki, ma fajny kolorowy output i rozumie .gitignore. Ale ripgrep go wyprzedził w benchmarkach z 2024 roku.

ack

Zaprojektowany głównie dla programistów:

ack „class.*User”

Automatycznie rozpoznaje typy plików i ma wbudowane profile dla różnych języków programowania. Ale jest napisany w Perlu i jest wolniejszy od ripgrep czy ag.

fd + rg combo

Fd to nowoczesna alternatywa dla find, napisana w Rust (jak ripgrep):

fd -e php -x rg „password”

To znajduje wszystkie pliki .php i w każdym uruchamia ripgrep. Czemu nie po prostu rg -t php? Bo czasem potrzebujesz więcej kontroli nad tym, KTÓRE pliki są przeszukiwane, a fd ma lepszą składnię niż find.

Skrypty i automatyzacja przeszukiwania

Po kilku miesiącach powtarzania tych samych komend, zaczniesz pisać skrypty. To naturalny proces. Oto kilka, które sam używam.

Skrypt do szukania w logach z datą

Zapisałem to jako search-logs.sh:

#!/bin/bash
DATE=$1
PATTERN=$2
find /var/log -name „*${DATE}*” -type f -exec grep -H „${PATTERN}” {} \;

Użycie: ./search-logs.sh 2026-02-09 „error”

Proste, ale oszczędza minutę za każdym razem. A przy 20 używaniach dziennie to już 20 minut.

Monitorowanie zmian w plikach konfiguracyjnych

Ten skrypt sprawdza, czy ktoś zmienił hasła w konfiguracjach:

#!/bin/bash
find /etc -name „*.conf” -mtime -1 -exec grep -l „password\|passwd\|haslo” {} \; | while read file; do
echo „Zmiana w: $file”
stat -c „%y” „$file”
done

Uruchamiam to przez cron raz dziennie. Raportuje do Slacka. Złapało już 3 nieautoryzowane zmiany w 2025 roku.

Najczęstsze błędy i jak ich unikać

Po latach widziałem (i popełniłem) prawie każdy możliwy błąd przy przeszukiwaniu plików.

Zapominanie o escapowaniu znaków specjalnych

Szukasz dosłownie „$user” w kodzie?

grep „\$user” – DOBRZE

grep „$user” – ŹLE (bash rozwinie zmienną)

Albo jeszcze lepiej, użyj pojedynczych cudzysłowów:

grep '$user’

To mnie ugryźło pewnego razu o 2 w nocy, gdy szukałem zmiennej w PHP i nie mogłem znaleźć czegoś, co było w pliku. 40 minut debugowania. Głupio mi było.

Przeszukiwanie katalogów do których nie masz dostępu

Bez sudo, grep będzie wyrzucał błędy „Permission denied” dla każdego chronionego pliku:

grep -r „pattern” /var 2>/dev/null

2>/dev/null wyrzuca błędy do kosza. Czasem przydatne, czasem ukrywa prawdziwe problemy. Używaj z rozwagą.

Nie testowanie wyrażeń regularnych przed użyciem

Regex jest zdradliwy. Zawsze testuję na małej próbce najpierw:

echo „test123@example.com” | grep -E „twoj_regex”

Albo używam regex101.com (tak, w 2026 nadal jest najlepszy do testowania).

Case study: prawdziwy przykład z produkcji

Grudzień 2025. Klient zgłasza, że 0.3% transakcji płatniczych kończy się błędem. Nie brzmi dużo, ale przy 100,000 transakcji dziennie to 300 失敗. I każda to potencjalnie utracony przychód.

Mam logi z 30 dni (500GB skompresowanych, 2.3TB rozpakowanych). Trzeba znaleźć wzorzec.

Pierwsza próba – zwykły grep na całości: Po 2 godzinach przerwałem proces. Nie działało.

Drugie podejście – ripgrep z filtrowaniem:

rg -z „transaction_error” –include=”payment-*.log.gz” -A 5 | grep „user_id” | sort | uniq -c | sort -n

To znalazło mi najczęściej występujących user_id z błędami. Zajęło 23 minuty.

Okazało się, że 87% błędów dotyczyło użytkowników z konkretnego regionu. Dalsze przeszukiwanie (już zawężone do tych userów) pokazało, że problem występował tylko przy płatnościach kartą Visa między 23:00 a 01:00. Bug w integracji z bramką płatniczą, która miała okno maintenance właśnie w tym czasie.

Fix wdrożony w 2 dni. Bez umiejętności efektywnego przeszukiwania logów, szukalibyśmy tygodniami.

Narzędzia z GUI – czy warto?

Jestem głównie terminal guy, ale… czasem GUI ma sens. Nie wstydzę się tego powiedzieć.

Visual Studio Code ma świetne wyszukiwanie z regex, wieloma plikami, excludes. Dla projektów deweloperskich często jest szybsze niż pisanie komendy w terminalu.

grep.app to webowy interfejs do przeszukiwania repozytoriów GitHub. Użyłem tego kilka razy gdy szukałem przykładów użycia obscure library. Działało zaskakująco dobrze.

glogg to GUI viewer dla logów z wyszukiwaniem. Używam gdy muszę pokazać coś non-technicznej osobie. Lub gdy jestem zbyt zmęczony na terminal. Zdarza się.

Przyszłość wyszukiwania w plikach

Ciekawe rzeczy dzieją się w tej przestrzeni. W 2025 i początkach 2026 widziałem kilka trendów:

LLM-assisted search – narzędzia używające AI do „rozumienia” kontekstu wyszukiwania. Testuję kilka, ale nadal w powijakach.

Semantic search dla kodu – zamiast szukać dokładnego ciągu znaków, szukasz „funkcji która robi X”. GitHub Copilot idzie w tym kierunku.

Real-time indexing – systemy które indeksują pliki w tle w miarę ich zmiany, dzięki czemu wyszukiwanie jest natychmiastowe. Tak jak robi to Elasticsearch, ale na poziomie systemu plików.

Według raportu Linux Foundation z początku 2026, wydajność narzędzi wyszukiwania wzrosła średnio o 40% w ciągu ostatnich 2 lat, głównie dzięki lepszemu wykorzystaniu wielu rdzeni i optymalizacjom algorytmów.

Podsumowanie kluczowych punktów

Po tych wszystkich słowach, oto najważniejsze wnioski z mojego doświadczenia:

  • Grep jest uniwersalny i zawsze dostępny – naucz się go dobrze, bo będzie Twoim podstawowym narzędziem
  • Ripgrep jest szybszy i ma lepsze defaults – zainstaluj go jeśli możesz
  • Zawsze zawężaj zakres przeszukiwania – wykluczaj katalogi, określaj typy plików, używaj przedziałów czasowych
  • Regex jest potężny ale zdradliwy – testuj wyrażenia zanim użyjesz ich na produkcji
  • Dla wielkich plików używaj specjalistycznych narzędzi lub technik jak równoległe przetwarzanie
  • Automatyzuj powtarzalne zadania – każdy skrypt który użyjesz więcej niż 3 razy warto zapisać
  • Nie wstydź się GUI gdy ma sens – narzędzie jest środkiem do celu, nie fetyszem

Pamiętaj też, że wydajność wyszukiwania to nie tylko narzędzie, ale też strategia. Zrozumienie struktury Twoich danych, wiedza gdzie szukać i czego unikać – to przychodzi z doświadczeniem.

Zakończenie

Przeszukiwanie plików w Linuxie to jedna z tych umiejętności, które rozwijasz przez całą karierę. Po 6 latach nadal uczę się nowych trików i odkrywam lepsze sposoby robienia rzeczy, które robiłem „wystarczająco dobrze”.

Kluczowe jest znalezienie narzędzi, które pasują do Twojego workflow. Dla mnie to głównie ripgrep do codziennej pracy, grep gdy pracuję na serwerach bez moich ulubionych narzędzi, i zestaw skryptów do specyficznych, powtarzających się zadań.

Nie ma jednego „najlepszego” sposobu. Jest tylko sposób, który działa dla Ciebie, w Twoim kontekście, z Twoimi danymi. Eksperymentuj, testuj, mierz czas wykonania, zapisuj co działa. I pamiętaj – każda sekunda zaoszczędzona na wyszukiwaniu to sekunda, którą możesz spędzić na rozwiązywaniu prawdziwego problemu.

A jak masz wątpliwości? Zawsze możesz zajrzeć do man pages. Serio, man grep ma odpowiedzi na 90% pytań. Drugie 10%? Stack Overflow nadal żyje i ma się dobrze w 2026.

Te artykuły mogą Ci się spodobać