Polecenie wc: liczenie wierszy i słów oraz wc -l z potokami
Polecenie wc to polecenie systemu Linux, które liczy i wypisuje liczbę wierszy, słów i bajtów w pliku. Gdy policzysz poleceniem wc -l wiersze przykładowego pliku z logiem dostępu serwera WWW, otrzymasz 10, a gdy grep odfiltruje tylko odpowiedzi 404 i przekażesz je do wc -l, zobaczysz liczbę nieudanych żądań, 3, jako jedną liczbę.
Logi, zawartość plików i katalog roboczy /root/work poniżej to przykładowe wartości. Log to dziesięciowierszowy plik utworzony z adresami IP zarezerwowanymi do dokumentacji, a pozostałe pliki również utworzono wyłącznie do testów.
1️⃣ Podstawy polecenia wc i odczytywanie wyniku
Podstawowa postać polecenia to wc, potem opcje, potem pliki. Jeśli podasz tylko plik bez opcji, wc wypisze kolejno liczbę wierszy, słów i bajtów, a na końcu doda nazwę pliku.
cd /root/workwc access.log 10 100 766 access.logW wyniku liczenia logu dostępu 10 to liczba wierszy, 100 liczba słów, a 766 liczba bajtów.
Aby zobaczyć tylko jedną liczbę, dodaj jedną z opcji -l, -w lub -c.
wc -l access.log10 access.logwc -w access.log100 access.logwc -c access.log766 access.logJeśli podasz plik, który nie istnieje, pojawi się komunikat o błędzie, a kod wyjścia wyniesie 1.
wc nosuch.txtwc: nosuch.txt: No such file or directoryecho $?12️⃣ Liczenie wierszy za pomocą wc -l i potoki
Gdy razem z liczbą wierszy wypisywana jest nazwa pliku, przy zapisywaniu liczby do zmiennej w skrypcie trzeba jeszcze raz odciąć nazwę. Jeśli przekażesz plik przekierowaniem (<) lub potokiem, wc nie zna nazwy pliku i wypisuje tylko liczbę.
wc -l < access.log10cat access.log | wc -l10Gdy postawisz grep przed potokiem, policzysz tylko wiersze spełniające warunek. Wyszukiwanie obejmowało spacje przed kodem odpowiedzi 404 i po nim, a 404 zawierały trzy wiersze.
grep ' 404 ' access.log | wc -l3Aby policzyć, ile adresów IP się połączyło, wytnij tylko pierwsze pole, usuń powtarzające się wiersze za pomocą sort -u i dopiero wtedy policz. W dziesięciowierszowym logu były cztery różne adresy IP.
cut -d ' ' -f 1 access.log | sort -u192.0.2.10
192.0.2.44
198.51.100.7
203.0.113.25cut -d ' ' -f 1 access.log | sort -u | wc -l4wc -l liczy znaki nowego wiersza. Dlatego dla pliku bez znaku nowego wiersza na końcu ostatniego wiersza wc -l wypisuje 1, choć cat pokazuje dwa wiersze.
cat no-newline.txtfirst line
last linewc -l no-newline.txt1 no-newline.txtJeśli liczba wierszy wychodzi o jeden za mała, najpierw sprawdź, czy ostatni wiersz kończy się znakiem nowego wiersza.
3️⃣ Opcje wc i liczba znaków z -c i -m
W UTF-8 litery angielskie i cyfry zajmują 1 bajt na znak, a znaki koreańskie (hangul) i ☕ po 3 bajty. Dlatego w pliku z samym tekstem angielskim liczba bajtów policzona przez -c i liczba znaków policzona przez -m są równe, ale gdy pojawia się koreański, obie liczby się różnią. Do porównania służy plik z dwoma wierszami koreańskich nazw z menu i jednym wierszem po angielsku.
cat menu.txt아메리카노
카페 라테 ☕
teawc -c menu.txt38 menu.txtwc -m menu.txt18 menu.txt-c dało 38, a -m 18, czyli różnicę 20. To dodatkowe 2 bajty zajmowane przez każdy z dziewięciu znaków koreańskich i ☕, więc w pliku z koreańskim trzeba liczyć przez -m, aby zgadzało się z rzeczywistą liczbą znaków. Pomiar wykonano w ustawieniach regionalnych C.UTF-8, a według podręcznika -m liczy w jednostkach znaków danych ustawień regionalnych.
-L wypisuje szerokość wyświetlania najdłuższego wiersza. W logu dostępu najdłuższy wiersz miał 82 kolumny; w pliku menu każdy znak koreański i ☕ zajmuje dwie kolumny, więc wiersz z 7 znaków dał 12.
wc -L access.log82 access.logwc -L menu.txt12 menu.txtLitery łacińskie ze znakami diakrytycznymi zajmują w UTF-8 2 bajty na znak. Zmierzono to osobno na pliku zawierającym tylko wiersz café.
cat cafe.txtcaféwc -c cafe.txt6 cafe.txtwc -m cafe.txt5 cafe.txt-c dało 6, a -m 5, bo jedno é zajęło o jeden bajt więcej. Litery angielskie i cyfry zajmują 1 bajt, litery z akcentem, takie jak é, 2 bajty, a znaki koreańskie i ☕ 3 bajty, więc liczba bajtów różni się nawet przy tej samej liczbie znaków.
Tabela zestawia polecenie pasujące do każdego zadania z liczbą policzoną w tym artykule.
| Zadanie | Polecenie | Pomiar w tym artykule |
|---|---|---|
| Pobranie samej liczby wierszy | wc -l < access.log | 10Sama liczba, bez nazwy pliku |
| Liczenie wierszy spełniających warunek | grep ‘ 404 ‘ access.log | wc -l | 3Wiersze z odpowiedzią 404 |
| Liczenie różnych wartości | cut -d ‘ ‘ -f 1 access.log | sort -u | wc -l | 4Liczba różnych adresów IP |
| Sprawdzenie rozmiaru pliku | wc -c access.log | 766Liczba bajtów |
| Liczba znaków pliku z tekstem koreańskim | wc -m menu.txt | 1838, gdy ten sam plik liczy się przez -c |
| Szerokość wyświetlania najdłuższego wiersza | wc -L access.log | 8212 dla pliku menu, w którym każdy znak koreański liczy się jako dwie kolumny |
| Suma wierszy wielu plików | wc -l *.log | 13Suma w wierszu total |
4️⃣ Suma dla wielu plików z wc w Linuksie
Jeśli podasz kilka plików, wc wypisze po jednym wierszu dla każdego pliku, a w ostatnim wierszu doda sumę jako total. Gdy policzysz razem log dostępu i log błędów, 13 w wierszu total to suma wierszy obu plików.
wc access.log error.log 10 100 766 access.log
3 11 76 error.log
13 111 842 totalAby za jednym razem policzyć logi z tym samym rozszerzeniem, użyj symbolu wieloznacznego. Powłoka zamienia *.log na nazwy plików i dopiero je przekazuje, więc wynik jest taki sam jak przy wpisaniu każdej nazwy pliku osobno.
wc -l *.log 10 access.log
3 error.log
13 totalPliki o różnych rozszerzeniach też policzysz za jednym razem, jeśli wpiszesz ich nazwy jedna po drugiej. Dwa logi i plik menu policzone razem dały total 16.
wc -l access.log error.log menu.txt 10 access.log
3 error.log
3 menu.txt
16 total🔲 Symulator polecenia wc
W symulatorze poniżej możesz samodzielnie wpisać wc na przykładowych plikach z artykułu. Za pomocą przycisków wypróbujesz -l, -m i liczenie przez potok, a gdy dodasz wiersz do access.log i policzysz jeszcze raz, pojawi się większa liczba.
🔢 FAQ & polecane treści
Linux · Tekst
Polecenie sort w Linuksie: sortowanie plików
Opcje i przykłady sort do sortowania zawartości pliku alfabetycznie, rosnąco lub malejąco.
Linux · Tekst
Polecenie uniq w Linuksie
Jak używać uniq, aby z powtarzających się wierszy zostawić tylko jeden i policzyć opcją -c, ile razy się powtarzają.
Linux · Tekst
Polecenia head i tail w Linuksie
Opcje i użycie head, które wypisuje pierwsze 10 wierszy pliku, oraz tail, które wypisuje ostatnie 10 wierszy.
ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.