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