Команда wc: подсчёт строк и слов и wc -l в конвейере

Тестовая средаСемейство RHELAlmaLinux 9.8Учётная запись rootПроверено 2026-10-29

Команда wc — это команда Linux, которая считает и выводит количество строк, слов и байтов в файле. Если посчитать с помощью wc -l строки примера журнала доступа веб-сервера, получится 10, а если отфильтровать grep только ответы 404 и передать их в wc -l, количество неудачных запросов, 3, видно одним числом.

Журналы, содержимое файлов и рабочая папка /root/work ниже — это примерные значения. Журнал — файл из десяти строк, составленный из IP-адресов, зарезервированных для документации, а остальные файлы тоже созданы только для проверки.

1️⃣ Основы команды wc и чтение её вывода

Базовая форма команды: wc, затем опции, затем файлы. Если указать только файл без опций, wc по порядку выведет число строк, слов и байтов и добавит в конце имя файла.

cd /root/work
wc access.log
 10 100 766 access.log

В результате подсчёта журнала доступа 10 — это число строк, 100 — число слов, 766 — число байтов.

Чтобы увидеть только одно число, добавьте одну из опций -l, -w или -c.

wc -l access.log
10 access.log
wc -w access.log
100 access.log
wc -c access.log
766 access.log

Если указать несуществующий файл, появится сообщение об ошибке, а код завершения будет 1.

wc nosuch.txt
wc: nosuch.txt: No such file or directory
echo $?
1

2️⃣ Подсчёт строк с wc -l и конвейеры

Если вместе с числом строк выводится имя файла, то при сохранении числа в переменную скрипта имя придётся отрезать ещё раз. Если передать файл через перенаправление (<) или конвейер, wc не знает имени файла и выводит только число.

wc -l < access.log
10
cat access.log | wc -l
10

Если поставить grep перед конвейером, можно посчитать только строки, подходящие под условие. Поиск включал пробелы до и после кода ответа 404, и строк с 404 оказалось три.

grep ' 404 ' access.log | wc -l
3

Чтобы посчитать, сколько разных IP подключалось, вырежьте только первое поле, удалите повторяющиеся строки с помощью sort -u и затем посчитайте. В журнале из десяти строк было четыре разных IP.

cut -d ' ' -f 1 access.log | sort -u
192.0.2.10
192.0.2.44
198.51.100.7
203.0.113.25
cut -d ' ' -f 1 access.log | sort -u | wc -l
4

wc -l считает количество символов перевода строки. Поэтому для файла, у которого в конце последней строки нет перевода строки, wc -l выводит 1, хотя cat показывает две строки.

cat no-newline.txt
first line
last line
wc -l no-newline.txt
1 no-newline.txt

Если строк получилось на одну меньше, сначала проверьте, заканчивается ли последняя строка переводом строки.

3️⃣ Опции wc и число символов с -c и -m

В UTF-8 английские буквы и цифры занимают 1 байт на символ, а корейские символы (хангыль) и ☕ — по 3 байта. Поэтому в файле только с английским текстом число байтов из -c и число символов из -m совпадают, а когда появляется корейский текст, эти два числа расходятся. Для сравнения используется файл с двумя строками корейских названий из меню и одной строкой на английском.

cat menu.txt
아메리카노
카페 라테 ☕
tea
wc -c menu.txt
38 menu.txt
wc -m menu.txt
18 menu.txt

-c дал 38, а -m — 18, разница 20. Это лишние 2 байта, которые занимает каждый из девяти корейских символов и ☕, поэтому для файла с корейским текстом символы нужно считать через -m, чтобы совпало с реальным числом символов. Измерение выполнено в локали C.UTF-8, и, согласно руководству, -m считает в единицах символов локали.

-L выводит ширину отображения самой длинной строки. В журнале доступа самая длинная строка занимала 82 колонки; в файле меню каждый корейский символ и ☕ занимают по две колонки, поэтому строка из 7 символов дала 12.

wc -L access.log
82 access.log
wc -L menu.txt
12 menu.txt

Латинские буквы с диакритикой занимают в UTF-8 2 байта на символ. Это измерено отдельно на файле, в котором есть только одна строка café.

cat cafe.txt
café
wc -c cafe.txt
6 cafe.txt
wc -m cafe.txt
5 cafe.txt

-c дал 6, а -m — 5, потому что одна буква é заняла на байт больше. Английские буквы и цифры занимают 1 байт, буквы с диакритикой вроде é — 2 байта, а корейские символы и ☕ — 3 байта, поэтому число байтов различается даже при одинаковом числе символов.

В таблице собраны подходящая команда для каждой задачи и число, подсчитанное в этой статье.

ЗадачаКомандаИзмерено в этой статье
Получить только число строкwc -l < access.log10Только число, без имени файла
Подсчитать строки, подходящие под условиеgrep ‘ 404 ‘ access.log | wc -l3Строки с ответом 404
Подсчитать разные значенияcut -d ‘ ‘ -f 1 access.log | sort -u | wc -l4Количество разных IP
Проверить размер файлаwc -c access.log766Число байтов
Число символов в файле с корейским текстомwc -m menu.txt1838, если посчитать тот же файл через -c
Ширина отображения самой длинной строкиwc -L access.log8212 для файла меню, где каждый корейский символ считается за две колонки
Сумма строк нескольких файловwc -l *.log13Итог в строке 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 и посчитать снова, появится увеличенное число.

Симулятор команды wcwc / учётная запись root
[root@server work]#
Клавишами ↑↓ можно вызвать ранее введённые команды.

🔢 FAQ & рекомендуемые материалы

Да, если считать строки, подходящие под условие, в одном файле. В том же журнале доступа grep -c с тем же условием тоже дал 3. grep -c обходится одной командой без конвейера, а wc -l используют, чтобы считать вывод и других команд кроме grep, например sort или cut.

Словом считается каждый фрагмент, отделённый пробелами, табуляциями или переводами строки. Результат [echo ‘log_level=warn timeout = 30’ | wc -w] — 4. log_level=warn без пробелов считается одним словом, а = с пробелами с обеих сторон — отдельным словом.

Выберите только файлы с помощью find и передайте их в wc -l. В папке-примере [find /root/work -type f | wc -l] вывел 5. [ls | wc -l] в той же папке тоже дал 5, но ls выводит строками и имена подпапок и не считает файлы внутри них.

🪐ИсточникиОфициальные источники 2

ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Докажите, что вы человек: 7   +   6   =