wc

Liczy linie, słowa, znaki i bajty w plikach.

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 zwraca ls, 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).