wc (od word count) to jeden z tych mikroskopijnych narzędzi z GNU coreutils, które robią dokładnie jedno i robią to dobrze: liczą linie, słowa, znaki i bajty w plikach albo w tym, co dostaną na standardowe wejście. Domyślnie wypluwa trzy liczby — linie, słowa, bajty — i nazwę pliku. Brzmi banalnie, ale w praktyce wc ląduje na końcu połowy pipe’ów, jakie napiszesz w terminalu, bo szybciej policzy wynik niż zdążysz otworzyć edytor.
Składnia i najważniejsze opcje
Podstawowa forma: wc [OPCJE] [PLIK...]. Bez podania pliku wc czyta ze standardowego wejścia (kończysz Ctrl+D).
-l(--lines) — liczy linie, czyli znaki nowej linii. Uwaga: to liczba znaków\n, nie „wierszy widocznych na ekranie”.-w(--words) — liczy słowa (ciągi znaków oddzielone białymi znakami).-c(--bytes) — liczy bajty. Dla plików ASCII równe liczbie znaków, dla UTF-8 już nie.-m(--chars) — liczy znaki z uwzględnieniem locale. Polskie „ą” to jeden znak (-m), ale dwa bajty (-c).-L(--max-line-length) — pokazuje długość najdłuższej linii. Świetne do znajdowania rozjechanego kodu.--files0-from=PLIK— czyta nazwy plików rozdzielone bajtem NUL z podanego pliku (albo z-jako wejścia). Ratunek, gdy lista plików nie mieści się w argumentach.
Przykłady użycia
wc -l plik.txt— zwraca samą liczbę linii w pliku. Najczęstsze użycie w całym uniwersum.ls | wc -l— liczy, ile pozycji zwracals, czyli szybki „ile plików mam w katalogu”.grep "ERROR" app.log | wc -l— zlicza wystąpienia „ERROR” w logu. Klasyczny debug jednolinijkowiec.wc -m artykul.txt— liczy znaki z locale, przydatne gdy piszesz tekst z limitem znaków.find . -name "*.py" -print0 | wc -l --files0-from=-— liczy linie we wszystkich plikach Pythona, bezpiecznie nawet przy nazwach ze spacjami.
Częste błędy i pułapki
Największa pułapka: wc -l liczy znaki nowej linii, a nie „wiersze”. Jeśli ostatnia linia pliku nie kończy się \n, wc jej nie doliczy — dostaniesz o jeden mniej, niż widzisz w edytorze. To nie bug, to definicja linii w POSIX.
Drugi klasyk: mylenie -c z -m. Przy tekstach z polskimi znakami albo emoji bajty i znaki to dwie różne liczby, a limity znaków (np. w meta description) liczy się w znakach, nie bajtach.
Trzecia sprawa: ls | wc -l policzy też ukryte pułapki, jeśli pliki mają nazwy z \n — dla twardych przypadków użyj find ... -print0 z --files0-from. Warto też wiedzieć, że macOS/BSD ma uboższy zestaw opcji niż GNU (brakuje długich form typu --lines), więc skrypty pisz na krótkich flagach, jeśli mają być przenośne.
Powiązane komendy: grep (filtrowanie przed liczeniem), sort i uniq -c (zliczanie unikatów), awk (gdy potrzebujesz liczyć coś sprytniejszego niż linie), nl (numerowanie linii).