← Весь справочник

wc

Посчитать строки, слова, байты и символы в файлах или выводе команды

wc (word count) считает строки, слова и байты. Чаще всего его ставят в конец конвейера, чтобы узнать, сколько строк выдала предыдущая команда.

Синтаксис

wc [опции] [файл…]
команда | wc -l

Опции

ОпцияЧто считает
-lстроки — точнее, символы перевода строки \n
-wслова — цепочки непробельных символов между пробелами, табуляциями и переводами строк
-cбайты
-mсимволы с учётом локали (в UTF-8 кириллическая буква — 1 символ, но 2 байта)
-Lширину самой длинной строки на экране (табуляция считается до ближайшей позиции, кратной 8)
--total=auto / always / only / neverкогда печатать строку total: при нескольких файлах (по умолчанию) / всегда / только её / никогда
--files0-from=Fвзять список файлов из F, имена разделены нулевым байтом (- — из stdin)

Формат вывода

Без опций печатаются три числа — строки, слова, байты — и имя файла. С опциями выводятся только выбранные счётчики, но всегда в одном порядке: строки, слова, символы, байты, макс. длина — независимо от того, в каком порядке опции написаны.

Если файлов несколько, в конце добавляется строка total. Если данные пришли из stdin, имени файла нет — удобно для скриптов. Числа выравниваются по ширине, поэтому в начале строки бывают пробелы.

Примеры

printf 'one two\nthree\n' > w.txt

# всё сразу: строки, слова, байты
wc w.txt

# только число строк — с именем файла и без
wc -l w.txt
wc -l < w.txt

# сохранить число в переменную
lines=$(wc -l < w.txt)
echo "$lines"

# сколько строк выдала команда
ls /etc | wc -l

# сколько строк совпало в grep (то же, что grep -c)
grep 'o' w.txt | wc -l

# длина строки в байтах (echo добавляет перевод строки)
echo -n 'abc' | wc -c

# итог по нескольким файлам; только итог
wc -l /etc/passwd /etc/group
wc -l --total=only /etc/passwd /etc/group

# самая длинная строка
wc -L /etc/passwd

# байты и символы в UTF-8
printf 'привет' | wc -c
printf 'привет' | LC_ALL=C.utf8 wc -m

# строки во всех .conf из find — безопасно для любых имён
find /etc -maxdepth 1 -type f -name '*.conf' -print0 | wc -l --files0-from=- | tail -n 1

Подводные камни

  • wc -l считает переводы строки. Если у последней строки нет \n в конце, она не посчитается: printf 'a\nb' | wc -l выдаст 1.
  • wc -l файл печатает и имя. Для чисел в скриптах читай из stdin: wc -l < файл, — тогда выводится только число.
  • echo добавляет перевод строки, поэтому echo abc | wc -c даёт 4. Для точной длины — echo -n или printf '%s'.
  • -c — байты, -m — символы. В песочнице локаль POSIX, и там -m тоже считает байты: привет даст 12 и с -c, и с -m. С LC_ALL=C.utf8 wc -m получится 6.
  • ls | wc -l — не точный счёт файлов: имя с переводом строки посчитается дважды, а скрытые файлы ls не показывает. Для точного подсчёта используй find с -printf '.' и wc -c.
  • Пустой ввод — это 0, а не ошибка; отсутствующий файл — ошибка с кодом 1.

См. также

grep · head и tail · uniq · find