linux streams

wc

Подсчёт строк, слов, символов и байт в файлах

Описание

wc (word count) — утилита для подсчёта количества строк, слов, символов и байт в файлах или стандартном вводе. Одна из старейших утилит Unix, присутствует во всех POSIX-совместимых системах. По умолчанию выводит три числа: количество строк, слов и байт.

Понятие «слово» в wc — это последовательность символов, разделённых пробелами, табуляциями или символами новой строки. «Строка» считается по символу перевода строки (\n). Разница между «символами» (-m) и «байтами» (-c) проявляется при работе с многобайтовыми кодировками: один кириллический символ UTF-8 занимает 2 байта, но является 1 символом.

wc часто используется в скриптах для проверки количества результатов поиска, подсчёта строк в выводе команд, оценки размера файлов. При передаче нескольких файлов выводит итоговую строку с суммарными значениями.

Синтаксис

wc [OPTION]... [FILE]...
# Вывод по умолчанию: строки, слова, байты $ wc file.txt 42 156 1024 file.txt # Только строки wc -l file.txt # Несколько файлов + итог wc -l *.py # Подсчёт строк в выводе команды grep "error" app.log | wc -l

Флаги и опции

Флаг Описание Пример
-l Подсчитать количество строк (newlines) wc -l file.txt
-w Подсчитать количество слов wc -w document.txt
-c Подсчитать количество байт wc -c binary.dat
-m Подсчитать количество символов (учитывает мультибайтовые) wc -m text_utf8.txt
-L Длина самой длинной строки (в символах) wc -L source.py
--files0-from=F Читать список файлов из файла F (разделитель NUL) wc --files0-from=list.txt

Паттерны использования

Подсчёт строк кода

# Строки во всех Python-файлах
wc -l *.py
find . -name "*.py" | xargs wc -l

# Только итог
find . -name "*.py" -exec cat {} + | wc -l

Проверка количества результатов

# Сколько процессов nginx
ps aux | grep nginx | wc -l

# Сколько ошибок в логе
grep -c "ERROR" app.log   # то же, что grep | wc -l

Проверка длины строк (линтинг)

# Самая длинная строка в файле
wc -L source.py

# Найти строки длиннее 79 символов
awk 'length > 79' source.py | wc -l

Размер файла в байтах

wc -c image.jpg
wc -c < file.txt    # только число (без имени)

# Сравнение байт и символов (UTF-8)
wc -c cyrillic.txt   # байты
wc -m cyrillic.txt   # символы

В условных выражениях скриптов

COUNT=$(grep "error" log.txt | wc -l)
if [ "$COUNT" -gt 0 ]; then
  echo "Found $COUNT errors!"
fi

Сводка по всем файлам

# Итоговая статистика по проекту
wc -l src/**/*.py src/**/*.js
# последняя строка — total

Советы и предупреждения

Совет: Чтобы получить только число (без имени файла), используйте перенаправление: wc -l < file.txt выведет только цифру, без имени файла.
Совет: Для подсчёта строк лучше использовать grep -c "pattern" вместо grep "pattern" | wc -l — это быстрее (меньше процессов).
Совет: При работе с файлами в UTF-8 различайте -c (байты) и -m (символы). Один символ кириллицы — 2 байта в UTF-8.
Внимание: wc -l считает символы новой строки \n. Если последняя строка файла не заканчивается на \n, она не будет посчитана. Это стандартное поведение POSIX.
Внимание: При большом количестве файлов не используйте wc -l * — shell может превысить лимит аргументов. Используйте find ... | xargs wc -l.