Przejdź do treści
Lekcja 7 z 117

Kurs › Moduł 1 › Lekcja 7

Rura i narzędzia do tekstu

⏱ ok. 9 min czytania· moduł 1: Praca w powłoce

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 -rn

I 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 -l

ls /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 dysku

Prawdziwe logi wyglądają podobnie, tylko są dłuższe i bardziej złośliwe.

grep: sito na linijki

grep ERROR log.txt

grep 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
  • -i ignoruje wielkość liter. Teraz są trzy linijki.
  • -c zamiast linijek podaje ich liczbę. Wynik: 3.
  • -n dopisuje numer linijki. Przydaje się, kiedy potem chcesz otworzyć plik w edytorze w dobrym miejscu.
  • -v odwraca sito: przepuszcza wszystko oprócz tego, co pasuje. „Pokaż wszystko, co nie jest zwykłym INFO”.
  • -r szuka 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 -rn

W 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 śliwka

Te 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.csv

W 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.txt

wc 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.txt

cut 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 -l

tee 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.conf

Czemu 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 -rn
  1. grep -i error log.txt zostawia trzy linijki z błędami, bez względu na wielkość liter.
  2. cut -d' ' -f4- odcina datę, godzinę i poziom. Zostaje „brak dysku”, „timeout bazy”, „brak dysku”.
  3. sort układa je tak, żeby takie same leżały obok siebie.
  4. uniq -c liczy powtórzenia.
  5. sort -rn układa od najczęstszego.

Wynik:

      2 brak dysku
      1 timeout bazy

Pięć 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:

  1. Prosi jądro systemu o rurę. Jądro tworzy w pamięci bufor z dwoma końcami: jednym się wkłada, drugim wyjmuje.
  2. Uruchamia ls i podpina jego pierwszy głośnik do wejścia rury.
  3. Uruchamia wc i 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ędzieFlagaCo robi
grep-iignoruje wielkość liter
grep-vpokazuje linijki, które NIE pasują
grep-cpodaje liczbę pasujących linijek
grep-ndopisuje numery linijek
grep-rszuka w folderze i podfolderach
grep-lpodaje tylko nazwy plików, w których coś znalazł
grep-wszuka całego słowa (kot nie złapie kotlet)
sort-nsortuje jak liczby
sort-rodwraca kolejność
sort-k Nsortuje po kolumnie N
sort-t Xkolumny oddziela znak X
sort-uusuwa duplikaty przy sortowaniu
sort-hsortuje rozmiary typu 2K, 5M, 1G
uniq-cliczy powtórzenia
uniq-dpokazuje tylko powtarzające się linijki
wc-l / -w / -clinijki / słowa / bajty
cut-d Xseparator kolumn
cut-f N / -f N-kolumna N / od N do końca
tr-dusuwa wskazane znaki
tr-sściska powtórzenia w jeden znak (np. wiele spacji w jedną)
tee-adopisuje zamiast nadpisywać

⚠ Typowy błąd

uniq -c owoce.txt

Wynik: 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 ERROR

Dział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 -rn

U mnie wyszło tak:

     32 /sbin/nologin
     20 /usr/sbin/nologin
      4 /bin/bash
      1 /bin/sync

Na 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.