Команда wc: подсчёт строк и слов и wc -l в конвейере
Команда wc — это команда Linux, которая считает и выводит количество строк, слов и байтов в файле. Если посчитать с помощью wc -l строки примера журнала доступа веб-сервера, получится 10, а если отфильтровать grep только ответы 404 и передать их в wc -l, количество неудачных запросов, 3, видно одним числом.
Журналы, содержимое файлов и рабочая папка /root/work ниже — это примерные значения. Журнал — файл из десяти строк, составленный из IP-адресов, зарезервированных для документации, а остальные файлы тоже созданы только для проверки.
1️⃣ Основы команды wc и чтение её вывода
Базовая форма команды: wc, затем опции, затем файлы. Если указать только файл без опций, wc по порядку выведет число строк, слов и байтов и добавит в конце имя файла.
cd /root/workwc access.log 10 100 766 access.logВ результате подсчёта журнала доступа 10 — это число строк, 100 — число слов, 766 — число байтов.
Чтобы увидеть только одно число, добавьте одну из опций -l, -w или -c.
wc -l access.log10 access.logwc -w access.log100 access.logwc -c access.log766 access.logЕсли указать несуществующий файл, появится сообщение об ошибке, а код завершения будет 1.
wc nosuch.txtwc: nosuch.txt: No such file or directoryecho $?12️⃣ Подсчёт строк с wc -l и конвейеры
Если вместе с числом строк выводится имя файла, то при сохранении числа в переменную скрипта имя придётся отрезать ещё раз. Если передать файл через перенаправление (<) или конвейер, wc не знает имени файла и выводит только число.
wc -l < access.log10cat access.log | wc -l10Если поставить grep перед конвейером, можно посчитать только строки, подходящие под условие. Поиск включал пробелы до и после кода ответа 404, и строк с 404 оказалось три.
grep ' 404 ' access.log | wc -l3Чтобы посчитать, сколько разных IP подключалось, вырежьте только первое поле, удалите повторяющиеся строки с помощью sort -u и затем посчитайте. В журнале из десяти строк было четыре разных 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 считает количество символов перевода строки. Поэтому для файла, у которого в конце последней строки нет перевода строки, wc -l выводит 1, хотя cat показывает две строки.
cat no-newline.txtfirst line
last linewc -l no-newline.txt1 no-newline.txtЕсли строк получилось на одну меньше, сначала проверьте, заканчивается ли последняя строка переводом строки.
3️⃣ Опции wc и число символов с -c и -m
В UTF-8 английские буквы и цифры занимают 1 байт на символ, а корейские символы (хангыль) и ☕ — по 3 байта. Поэтому в файле только с английским текстом число байтов из -c и число символов из -m совпадают, а когда появляется корейский текст, эти два числа расходятся. Для сравнения используется файл с двумя строками корейских названий из меню и одной строкой на английском.
cat menu.txt아메리카노
카페 라테 ☕
teawc -c menu.txt38 menu.txtwc -m menu.txt18 menu.txt-c дал 38, а -m — 18, разница 20. Это лишние 2 байта, которые занимает каждый из девяти корейских символов и ☕, поэтому для файла с корейским текстом символы нужно считать через -m, чтобы совпало с реальным числом символов. Измерение выполнено в локали C.UTF-8, и, согласно руководству, -m считает в единицах символов локали.
-L выводит ширину отображения самой длинной строки. В журнале доступа самая длинная строка занимала 82 колонки; в файле меню каждый корейский символ и ☕ занимают по две колонки, поэтому строка из 7 символов дала 12.
wc -L access.log82 access.logwc -L menu.txt12 menu.txtЛатинские буквы с диакритикой занимают в UTF-8 2 байта на символ. Это измерено отдельно на файле, в котором есть только одна строка café.
cat cafe.txtcaféwc -c cafe.txt6 cafe.txtwc -m cafe.txt5 cafe.txt-c дал 6, а -m — 5, потому что одна буква é заняла на байт больше. Английские буквы и цифры занимают 1 байт, буквы с диакритикой вроде é — 2 байта, а корейские символы и ☕ — 3 байта, поэтому число байтов различается даже при одинаковом числе символов.
В таблице собраны подходящая команда для каждой задачи и число, подсчитанное в этой статье.
| Задача | Команда | Измерено в этой статье |
|---|---|---|
| Получить только число строк | wc -l < access.log | 10Только число, без имени файла |
| Подсчитать строки, подходящие под условие | grep ‘ 404 ‘ access.log | wc -l | 3Строки с ответом 404 |
| Подсчитать разные значения | cut -d ‘ ‘ -f 1 access.log | sort -u | wc -l | 4Количество разных IP |
| Проверить размер файла | wc -c access.log | 766Число байтов |
| Число символов в файле с корейским текстом | wc -m menu.txt | 1838, если посчитать тот же файл через -c |
| Ширина отображения самой длинной строки | wc -L access.log | 8212 для файла меню, где каждый корейский символ считается за две колонки |
| Сумма строк нескольких файлов | wc -l *.log | 13Итог в строке total |
4️⃣ Итог по нескольким файлам с wc в Linux
Если указать несколько файлов, wc выводит по строке на каждый файл и добавляет в последней строке итог как total. Если посчитать вместе журнал доступа и журнал ошибок, 13 в строке total — это сумма строк обоих файлов.
wc access.log error.log 10 100 766 access.log
3 11 76 error.log
13 111 842 totalЧтобы посчитать сразу все журналы с одинаковым расширением, используйте подстановочный знак. Оболочка заменяет *.log именами файлов и передаёт их дальше, поэтому результат тот же, что и при перечислении каждого имени файла.
wc -l *.log 10 access.log
3 error.log
13 totalФайлы с разными расширениями тоже можно посчитать за раз, если перечислить их имена подряд. Два журнала и файл меню вместе дали total 16.
wc -l access.log error.log menu.txt 10 access.log
3 error.log
3 menu.txt
16 total🔲 Симулятор команды wc
В симуляторе ниже можно самостоятельно вводить wc на файлах-примерах из статьи. Кнопками-чипами можно попробовать -l, -m и подсчёт через конвейер, а если добавить строку в access.log и посчитать снова, появится увеличенное число.
🔢 FAQ & рекомендуемые материалы
Linux · Текст
Команда sort в Linux: сортировка файлов
Опции и примеры sort для сортировки содержимого файла по алфавиту, по возрастанию или по убыванию.
Linux · Текст
Команда uniq в Linux
Как с помощью uniq оставить только одну из повторяющихся строк и посчитать опцией -c, сколько раз она повторяется.
Linux · Текст
Команды head и tail в Linux
Опции и использование head, которая выводит первые 10 строк файла, и tail, которая выводит последние 10 строк.
ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.