Урок 4 из 8 · 20 мин · обновлено

Читать и искать: cat, less, tail, grep, find

Как посмотреть содержимое файла целиком и постранично, увидеть начало и конец лога, следить за логом в реальном времени, найти строки командой grep и файлы командой find.

Учебный лог

Логи — журналы, куда программы записывают, что происходит. Их приходится читать разработчикам, тестировщикам и администраторам. Создадим учебный лог интернет-магазина: скопируйте команду целиком, вместе со строками до EOF.

Терминал
cd ~/practice
cat > app.log << 'EOF'
2026-10-20 09:15 INFO Заказ 101 создан
2026-10-20 09:17 ERROR Оплата заказа 101 не прошла
2026-10-20 09:20 INFO Заказ 102 создан
2026-10-20 09:21 INFO Заказ 101 оплачен
2026-10-20 09:40 ERROR Нет связи с сервером доставки
2026-10-20 10:02 INFO Заказ 103 создан
2026-10-20 10:05 WARN Медленный ответ базы данных
2026-10-20 10:30 ERROR Оплата заказа 103 не прошла
EOF

Такая запись передаёт команде cat текст до слова EOF, а > сохраняет его в файл. Подробнее о > — в следующем уроке.

Посмотреть: cat, less, head, tail

  • cat app.log — вывести файл целиком. Удобно для коротких файлов;
  • less app.log — открыть постранично. Листать — пробелом и стрелками, искать — /слово и Enter, выйти — Q;
  • head — начало файла, tail — конец. По умолчанию по 10 строк, число задаёт -n.
Терминал
head -n 3 app.log
tail -n 2 app.log
Результат
2026-10-20 09:15 INFO Заказ 101 создан
2026-10-20 09:17 ERROR Оплата заказа 101 не прошла
2026-10-20 09:20 INFO Заказ 102 создан
2026-10-20 10:05 WARN Медленный ответ базы данных
2026-10-20 10:30 ERROR Оплата заказа 103 не прошла

В логах самое свежее — внизу, поэтому их обычно читают с конца. А tail -f app.log следит за файлом: показывает новые строки, как только программа их дописывает. Так смотрят, что происходит на сервере прямо сейчас. Выход — Ctrl+C.

grep: найти строки

grep печатает строки, в которых есть нужный текст:

Терминал
grep ERROR app.log
Результат
2026-10-20 09:17 ERROR Оплата заказа 101 не прошла
2026-10-20 09:40 ERROR Нет связи с сервером доставки
2026-10-20 10:30 ERROR Оплата заказа 103 не прошла

Полезные параметры:

  • -i — без учёта регистра: grep -i error app.log найдёт и ERROR, и Error;
  • -c — только посчитать строки: grep -c ERROR app.log выведет 3;
  • -v — наоборот, строки без этого текста: grep -v INFO app.log;
  • -n — показать номера строк;
  • -r — искать во всех файлах папки и вложенных: grep -r "TODO" projects/.

Если в искомом тексте есть пробелы, его берут в кавычки: grep "Заказ 101" app.log.

find: найти файлы

grep ищет внутри файлов, а find — сами файлы:

Терминал
find . -name "*.jpg"
Результат
./photos/jpg/cat.jpg
./photos/jpg/dog.jpg
  • . — где искать: в текущей папке и во всех вложенных;
  • -name "*.jpg" — по имени, шаблон берут в кавычки. -iname — без учёта регистра;
  • -type d — только папки, -type f — только файлы;
  • -size +100M — файлы больше 100 мегабайт. Помогает понять, чем занят диск;
  • -mtime -1 — изменённые за последние сутки.

Попробуйте сами. Выясните по app.log: сколько всего ошибок, какие записи касаются заказа 101 и какие строки не являются информационными, то есть без INFO.

Решение
Терминал
grep -c ERROR app.log
grep "заказа 101\|Заказ 101" app.log
grep -v INFO app.log
Результат
3
2026-10-20 09:15 INFO Заказ 101 создан
2026-10-20 09:17 ERROR Оплата заказа 101 не прошла
2026-10-20 09:21 INFO Заказ 101 оплачен
2026-10-20 09:17 ERROR Оплата заказа 101 не прошла
2026-10-20 09:40 ERROR Нет связи с сервером доставки
2026-10-20 10:05 WARN Медленный ответ базы данных
2026-10-20 10:30 ERROR Оплата заказа 103 не прошла

\| в шаблоне grep означает «или»: подходят строки и с «Заказ 101», и с «заказа 101». Можно проще — искать только число: grep 101 app.log. Но тогда попадут и строки, где 101 встречается случайно, например во времени или сумме.

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. Лог на миллион строк. Как посмотреть только последние 20 строк?

  2. Что выведет grep ERROR app.log?

  3. Как найти все файлы .jpg во всех вложенных папках текущей папки?

  4. Как следить за логом, пока программа продолжает в него писать?