Rura i narzędzia do tekstu
Po tej lekcji: kursant łączy komendy pionową kreską i z kilku małych narzędzi składa odpowiedź na konkretne pytanie, na przykład „jakie błędy były dziś w logu i ile razy”.
Wstęp
Szef pisze o dziewiątej rano: „Co się w nocy sypało na serwerze i jak często?”.
Możesz otworzyć ten plik i czytać. Pięć tysięcy linijek. Do obiadu skończysz, do kolacji policzysz.
Albo wpiszesz jedną linijkę:
grep -i error log.txt | cut -d' ' -f4- | sort | uniq -c | sort -rnI po sekundzie masz ranking: ten błąd dwa razy, tamten raz. Od najczęstszego. Dziś rozbierzemy tę linijkę na części i zobaczysz, że to tylko pięć prostych narzędzi trzymających się za ręce.
Rura, czyli taśma w fabryce
Znak |, pionowa kreska, nazywa się rurą. Po angielsku pipe. Na klawiaturze zwykle jest nad Enterem, z Shiftem.
Wyobraź sobie taśmę w fabryce. Pierwszy pracownik coś robi i kładzie na taśmę. Drugi bierze z taśmy, robi swoje i kładzie dalej. Trzeci pakuje. Nikt nie biega z kartonami do magazynu i z powrotem.
Rura robi dokładnie to: wynik komendy po lewej idzie prosto na wejście komendy po prawej. Bez plików po drodze.
ls /etc | wc -lls /etc wypisuje listę plików w folderze /etc. Zamiast na ekran, lista jedzie rurą do wc -l, które liczy linijki. Wynik: ile plików jest w /etc. U mnie sto sześćdziesiąt kilka. Folder z ustawieniami systemu, więc sporo ustawień.
Pamiętasz dwa głośniki z poprzedniej lekcji? Rura bierze tylko pierwszy, ten od normalnych wyników. Błędy dalej lecą na ekran. Jeśli chcesz je też wysłać rurą, jest 2>&1 przed kreską albo krócej |&.
Przykładowy log do ćwiczeń
plik log.txt, sześć linijek
2026-11-03 08:01 INFO start
2026-11-03 08:02 ERROR brak dysku
2026-11-03 08:03 INFO user eryk zalogowany
2026-11-03 08:04 error timeout bazy
2026-11-03 08:05 WARN wolno
2026-11-03 08:06 ERROR brak dyskuPrawdziwe logi wyglądają podobnie, tylko są dłuższe i bardziej złośliwe.
grep: sito na linijki
grep ERROR log.txtgrep przepuszcza tylko linijki, w których jest szukane słowo. Resztę wyrzuca. Jak sito w kuchni, tylko łapie słowa zamiast makaronu.
Wynik: dwie linijki z ERROR. Ale chwila, w logu jest jeszcze error małymi literami. grep domyślnie rozróżnia wielkość liter. Dla niego ERROR i error to dwa różne słowa, jak dla urzędnika „Kowalski” i „kowalski”.
grep -i error log.txt
grep -c -i error log.txt
grep -n WARN log.txt
grep -v INFO log.txt
grep -r ERROR /etc/moja_aplikacja-iignoruje wielkość liter. Teraz są trzy linijki.-czamiast linijek podaje ich liczbę. Wynik:3.-ndopisuje numer linijki. Przydaje się, kiedy potem chcesz otworzyć plik w edytorze w dobrym miejscu.-vodwraca sito: przepuszcza wszystko oprócz tego, co pasuje. „Pokaż wszystko, co nie jest zwykłym INFO”.-rszuka we wszystkich plikach w folderze i w jego podfolderach. Pytanie „w którym pliku konfiguracyjnym ktoś ustawił ten port?” załatwia jedna komenda.
sort i uniq: układanie i liczenie
sort owoce.txt
sort owoce.txt | uniq -c
sort owoce.txt | uniq -c | sort -rnW pliku owoce.txt jest sześć linijek: trzy jabłka, dwie gruszki, jedna śliwka, wymieszane.
sort układa linijki alfabetycznie. uniq -c zlicza powtórzenia, ale tylko takie, które leżą obok siebie. Dlatego przed uniq prawie zawsze stoi sort. A ostatnie sort -rn układa wynik po liczbach, od największej.
Wynik:
3 jabłko
2 gruszka
1 śliwkaTe trzy kroki, sort | uniq -c | sort -rn, to najczęściej używana trójka w całym Bashu. Ranking czegokolwiek: adresów IP, które najczęściej pukają do serwera, błędów, użytkowników. Zapisz ją sobie na karteczce i przyklej do monitora, obok hasła, którego tam nie trzymasz.
Pliki z kolumnami, czyli CSV:
sort -t, -k3 -n ludzie.csvW pliku są linijki typu Ania,Kraków,34. -t, mówi: kolumny oddziela przecinek. -k3 mówi: sortuj po trzeciej kolumnie. -n mówi: to są liczby, a nie napisy.
Po co to -n? Bez niego sort porównuje znak po znaku, jak w słowniku. I wtedy 100 jest przed 9, bo jedynka jest przed dziewiątką. Matematyk płacze, słownik się zgadza.
wc: licznik
wc -l log.txt
wc -w log.txt
wc -c log.txtwc to „word count”. -l liczy linijki, -w słowa, -c bajty. Admini używają głównie -l, bo najczęstsze pytanie brzmi „ile tego jest”.
cut: nożyczki do kolumn
cut -d, -f2 ludzie.csv
cut -d' ' -f4- log.txtcut wycina kolumny. -d to separator, czyli czym są oddzielone kolumny. -f to numer kolumny. -f2 daje drugą kolumnę, -f4- daje wszystko od czwartej do końca.
W naszym logu kolumny oddziela spacja: data, godzina, poziom, a od czwartej kolumny treść komunikatu. Dlatego w haku było cut -d' ' -f4-. Wycinamy sam komunikat, bez daty, bo data psułaby liczenie: każda linijka byłaby inna.
tr: zamiana znaków
echo "krzycz" | tr 'a-z' 'A-Z'
echo "a-b-c" | tr '-' ' '
echo "aaabbb" | tr -d 'a'tr zamienia jedne znaki na inne. Małe litery na wielkie, myślniki na spacje. Z -d usuwa wskazane znaki.
tee: rozgałęziacz
grep ERROR log.txt | tee bledy_dzis.txt | wc -ltee to trójnik hydrauliczny. Bierze to, co płynie rurą, zapisuje kopię do pliku i puszcza dalej. Tu błędy lądują w bledy_dzis.txt, a dalej wc -l je liczy. Masz i zapis, i wynik na ekranie.
tee -a dopisuje do pliku zamiast nadpisywać, tak jak >>. A najczęstsze użycie w pracy admina wygląda tak:
echo "nameserver 1.1.1.1" | sudo tee -a /etc/resolv.confCzemu nie sudo echo ... >> plik? Bo przekierowanie robi Bash, a Bash nie ma uprawnień roota. sudo dostaje tylko echo. To jak wysłanie szefa do okienka po pieczątkę, a potem samemu próba wejścia do archiwum. Szczegóły w lekcji o uprawnieniach.
Rozbieramy linijkę z haka
grep -i error log.txt | cut -d' ' -f4- | sort | uniq -c | sort -rngrep -i error log.txtzostawia trzy linijki z błędami, bez względu na wielkość liter.cut -d' ' -f4-odcina datę, godzinę i poziom. Zostaje „brak dysku”, „timeout bazy”, „brak dysku”.sortukłada je tak, żeby takie same leżały obok siebie.uniq -cliczy powtórzenia.sort -rnukłada od najczęstszego.
Wynik:
2 brak dysku
1 timeout bazyPięć narzędzi, z których żadne nie wie nic o logach. Każde robi jedną małą rzecz. I to jest cała filozofia Uniksa w jednym zdaniu: małe programy, które robią jedną rzecz dobrze, połączone rurą. Jak klocki LEGO, tylko nikt nie depcze na nie boso o trzeciej w nocy. No, chyba że na dyżurze.
Jak to działa pod spodem
Kiedy Bash widzi ls /etc | wc -l, robi trzy rzeczy:
- Prosi jądro systemu o rurę. Jądro tworzy w pamięci bufor z dwoma końcami: jednym się wkłada, drugim wyjmuje.
- Uruchamia
lsi podpina jego pierwszy głośnik do wejścia rury. - Uruchamia
wci podpina jego wejście do wyjścia rury.
Ważne: obie komendy startują jednocześnie, a nie po kolei. wc nie czeka, aż ls skończy. Czyta, co przypływa, na bieżąco. Jeśli ls produkuje szybciej, niż wc nadąża czytać, bufor się zapełnia i jądro po prostu wstrzymuje ls, aż zrobi się miejsce. Jak taśma przy kasie: kiedy jest pełna, przestajesz wykładać zakupy.
Dlatego rura działa nawet na plikach większych niż cała pamięć komputera. Nic nie jest trzymane w całości, wszystko płynie.
Ściąga flag
| Narzędzie | Flaga | Co robi |
|---|---|---|
grep | -i | ignoruje wielkość liter |
grep | -v | pokazuje linijki, które NIE pasują |
grep | -c | podaje liczbę pasujących linijek |
grep | -n | dopisuje numery linijek |
grep | -r | szuka w folderze i podfolderach |
grep | -l | podaje tylko nazwy plików, w których coś znalazł |
grep | -w | szuka całego słowa (kot nie złapie kotlet) |
sort | -n | sortuje jak liczby |
sort | -r | odwraca kolejność |
sort | -k N | sortuje po kolumnie N |
sort | -t X | kolumny oddziela znak X |
sort | -u | usuwa duplikaty przy sortowaniu |
sort | -h | sortuje rozmiary typu 2K, 5M, 1G |
uniq | -c | liczy powtórzenia |
uniq | -d | pokazuje tylko powtarzające się linijki |
wc | -l / -w / -c | linijki / słowa / bajty |
cut | -d X | separator kolumn |
cut | -f N / -f N- | kolumna N / od N do końca |
tr | -d | usuwa wskazane znaki |
tr | -s | ściska powtórzenia w jeden znak (np. wiele spacji w jedną) |
tee | -a | dopisuje zamiast nadpisywać |
⚠ Typowy błąd
uniq -c owoce.txtWynik: każdy owoc ma licznik 1. Jabłko trzy razy po jeden.
Dlaczego? Bo uniq porównuje tylko sąsiadów. Nie pamięta, co było pięć linijek wyżej. Jak bramkarz, który sprawdza tylko, czy tył kolejki nie stoi dwa razy pod rząd. Rozwiązanie: najpierw sort, potem uniq.
I drugi, łagodniejszy grzech:
cat log.txt | grep ERRORDziała, ale cat jest tu zbędny, bo grep sam umie czytać pliki: grep ERROR log.txt. W internecie ten błąd ma nawet własną nazwę, „bezużyteczne użycie cata”. Nikomu krzywdy nie robi, ale na rozmowie rekrutacyjnej ktoś może się uśmiechnąć pod nosem.
✎ Zadanie
W pliku /etc/passwd każdy użytkownik systemu ma jedną linijkę. Kolumny oddziela dwukropek, a ostatnia, siódma kolumna mówi, jaką powłokę ten użytkownik dostaje po zalogowaniu. Jedną linijką z rurami zrób ranking: która powłoka występuje najczęściej.
Podpowiedź: cut, sort, uniq, sort. Wynik Cię zaskoczy, bo większość „użytkowników” to wcale nie ludzie.
Pokaż rozwiązanie
cut -d: -f7 /etc/passwd | sort | uniq -c | sort -rnU mnie wyszło tak:
32 /sbin/nologin
20 /usr/sbin/nologin
4 /bin/bash
1 /bin/syncNa pierwszym miejscu nologin. To powłoka, która grzecznie mówi „nie możesz się zalogować” i kończy rozmowę. Dostają ją konta, które nie są ludźmi: serwer WWW, baza danych, poczta. Programy mają w Linuksie własne konta, żeby każdy miał tylko swoje klucze. Ludzi jest w systemie zwykle garstka, a cała reszta to obsługa techniczna, która nie ma prawa wejść do budynku głównym wejściem.
Co dalej
W zadaniu pojawią się dziwne ścieżki: /bin, /usr/sbin, /etc. W następnej lekcji rozkładamy na stół mapę całego Linuksa. Co leży w którym folderze, czemu tak, a nie inaczej, i gdzie szukać, kiedy coś się zepsuje.