Нужно понять насколько вырос лог за ночь. Или проверить сколько записей в CSV перед импортом. Или убедиться что конфиг не обрезался при копировании. Количество строк в файле — быстрая и полезная метрика, и в Linux есть несколько способов её получить.
wc -l: основной инструмент
wc (word count) считает строки, слова и символы. Флаг -l выводит только строки:
wc -l filename.txt
42 filename.txt
Если нужно только число без имени файла — передать через пайп:
wc -l < filename.txt
42
Разница важна для скриптов: первый вариант всегда добавляет имя файла в вывод, второй — только число.
Несколько файлов и итог
Подсчитать строки в нескольких файлах сразу:
wc -l file1.txt file2.txt file3.txt
120 file1.txt
85 file2.txt
204 file3.txt
409 total
wc автоматически добавляет строку total с суммой. Полезно для быстрой сводки по группе логов.
По маске — все .log файлы в директории:
wc -l /var/log/nginx/*.log
Рекурсивно по всем файлам в директории:
find /var/log -name "*.log" -exec wc -l {} +
grep -c: строки содержащие паттерн
grep -c считает не все строки, а только те которые совпадают с шаблоном:
grep -c "ERROR" /var/log/app.log
Подсчитать строки с ошибками за сегодня:
grep -c "$(date +%Y-%m-%d)" /var/log/syslog
Если нужно именно количество всех строк через grep — считать с универсальным паттерном:
grep -c "" filename.txt
Пустой шаблон совпадает с каждой строкой.
awk: подсчёт с условием
awk считает строки через встроенную переменную NR (number of records):
awk 'END {print NR}' filename.txt
Посчитать только непустые строки:
awk 'NF' filename.txt | wc -l
NF (number of fields) равен нулю для пустых строк — такие строки awk пропустит.
Посчитать строки длиннее 80 символов:
awk 'length > 80 {count++} END {print count}' filename.txt
sed: быстрый счётчик
sed с флагом -n и командой $= выводит номер последней строки — что равносильно количеству строк:
sed -n '$=' filename.txt
Компактно и быстро, особенно на больших файлах где wc может быть медленнее из-за полного прохода.
Подсчёт строк в сжатом файле
Логи часто хранятся в gzip. Читать без распаковки:
zcat /var/log/syslog.1.gz | wc -l
Для .bz2:
bzcat file.bz2 | wc -l
Количество строк в выводе команды
Подсчитать сколько процессов запущено:
ps aux | wc -l
Сколько открытых соединений на порту 80:
ss -tn | grep ':80' | wc -l
Сколько файлов в директории:
ls /var/www/html | wc -l
Нюанс: последняя строка без переноса
wc -l считает символы \n. Если файл заканчивается без символа новой строки — последняя строка не учитывается. Это важно для файлов которые генерируются программами.
Проверить есть ли перенос в конце файла:
tail -c 1 filename.txt | xxd
Если вывод пустой — файл заканчивается на \n. Если показывает символ — переноса нет и wc -l занижает результат на 1.
Шпаргалка
| Задача | Команда |
|---|---|
| Количество строк в файле | wc -l filename |
| Только число (без имени) | wc -l < filename |
| Несколько файлов с итогом | wc -l file1 file2 file3 |
| Рекурсивно по директории | find /path -name "*.log" -exec wc -l {} + |
| Строки с совпадением | grep -c "pattern" filename |
| Только непустые строки | awk 'NF' filename | wc -l |
| Через awk | awk 'END {print NR}' filename |
| Через sed | sed -n '$=' filename |
| В сжатом gz файле | zcat file.gz | wc -l |
| В выводе команды | ps aux | wc -l |