урок 4 из 10

Чтение и поиск

Читать файлы подходящей командой — cat, less, head, tail и tail -f, — искать строки grep с нужными ключами, искать файлы find по имени, возрасту и размеру и удалять найденное только после просмотра списка.

9 мин чтения · 4 главы ·5 заданий ·домашняя работа

Прочитать файл

В Linux почти всё хранится в обычных текстовых файлах: настройки, журналы, списки. Поэтому умение быстро прочитать нужное и найти нужную строку — половина работы в терминале.

Короткий:catДлинный:lessНачалоили конец:head, tailРастётсейчас:tail -f
Выбор зависит от размера и от того, что нужно увидеть. Короткий файл — целиком; длинный — листать; журнал — его конец, а живой журнал — следить, как он растёт.

Короткий файл целиком — cat. Она просто выводит содержимое в окно. Для файла на десять строк это удобно; для журнала на сто тысяч — нет: текст пролетит мимо, и вы увидите только последний экран.

Длинный файл — less. Он показывает файл постранично и позволяет листать и искать внутри. Главные клавиши:

КлавишаДействие
Пробел / bстраница вперёд / назад
g / Gв начало / в конец
/словонайти вниз по тексту, n — следующее
qвыйти

less ничего не меняет в файле и открывается мгновенно даже для огромных журналов: он читает только ту часть, которую показывает. Поэтому для просмотра настроек и журналов на сервере его стоит предпочесть редактору — в редакторе легко случайно что-то нажать и сохранить.

cat notes.txt
less /var/log/syslog

Начало, конец, счёт

Часто нужен не весь файл, а его край. Журналы растут вниз, поэтому свежее — в конце.

head -n 20 app.log     # первые 20 строк
tail -n 50 app.log     # последние 50 строк
tail -f app.log        # следить: новые строки появляются сами, выход — Ctrl+C
wc -l app.log          # сколько строк в файле

tail -f — любимая команда всех, кто разбирается, почему что-то не работает. Откройте журнал в одном окне, повторите действие, которое ломается, — и увидите ошибку в момент её появления. Не нужно гадать, какая из тысячи строк относится к вашей попытке.

wc считает строки, слова и знаки. С ключом -l — только строки, и это самый частый вариант: «сколько ошибок за ночь», «сколько пользователей в списке». Сам по себе wc кажется скромным, но в следующем уроке, соединённый с поиском, он станет инструментом ответа на вопрос «сколько».

Ещё один приём: у многих служб журнал со временем разрезается на части — app.log, app.log.1, app.log.2.gz. Свежий — без номера, чем больше номер, тем старше. Сжатые части читают командами с приставкой z: zcat, zless, zgrep.

grep: строки внутри

Найти строку в файле — grep. Он печатает только те строки, в которых встречается искомое.

grep error app.log          # строки со словом error
grep -i error app.log       # без учёта регистра: error, Error, ERROR
grep -n error app.log       # с номерами строк
grep -v DEBUG app.log       # все строки, КРОМЕ содержащих DEBUG
grep -r "db_host" /etc/app  # искать во всех файлах папки
grep -c error app.log       # только число найденных строк

Ключи комбинируются: grep -in — без учёта регистра и с номерами. Самые полезные на практике — -i (в журналах одно и то же слово бывает написано по-разному), -n (чтобы открыть файл на нужном месте) и -r (когда не знаешь, в каком из файлов настройки прячется нужная строка).

Искомое можно взять в кавычки, если в нём пробелы: grep "connection refused" app.log. А ещё grep понимает регулярные выражения — особый язык шаблонов для текста. Например, grep "^#" найдёт строки, которые начинаются с решётки, то есть закомментированные. Регулярные выражения — большая тема; для начала хватит знать, что знаки вроде точки, звёздочки и крышки у grep значат не себя, и если ищете их буквально, лучше добавить ключ -F.

find: сами файлы

grep ищет внутри файлов. Чтобы найти сами файлы — по имени, размеру, возрасту, — есть find.

find . -name "*.pdf"                  # все pdf в текущей папке и глубже
find ~ -iname "отчёт*"                # по имени без учёта регистра
find /var/log -type f -mtime +7       # файлы старше 7 суток
find . -type f -size +100M            # файлы больше 100 МБ
find . -type d -empty                 # пустые папки

Устроен find так: сначала где искать, затем условия. Условия складываются через «и»: -type f -mtime +7 — обычные файлы, изменённые больше семи суток назад. Шаблон имени берут в кавычки, чтобы звёздочку не раскрыла оболочка раньше времени.

Самые полезные условия:

УсловиеСмысл
-name, -inameпо имени, с шаблоном
-type f / -type dтолько файлы / только папки
-mtime +N / -mtime -Nизменён больше / меньше N суток назад
-size +Nбольше указанного размера

У find есть ключ -delete, который удаляет найденное, и -exec, который запускает команду для каждого найденного. Оба мощные и оба опасные: ошибка в условии — и удалится не то. Правило то же, что и с шаблонами: сначала запустить find без удаления, посмотреть список, и только потом добавить -delete.

Когда место на диске вдруг кончилось, обычно помогает связка из прошлого урока и этого: df -h — какой диск полон, du -sh по папкам — где тяжело, find -size — какие файлы виноваты.

Задания урока

Каждое проверяется сразу: ответ сверяется с эталоном, и на неверный вариант приходит разбор.

  1. Разложите команды: безопасны для настройки или могут её изменить.средне
  2. Сопоставьте задачу и команду.легко
  3. grep ищет файлы по имени, а find — строки внутри файлов.средне
  4. Заполните пропуски.средне
  5. Расставьте безопасную чистку старых архивов через find.средне

Практика и материалы по теме курса

Пройти урок с проверкой заданий Курс «Linux и командная строка» открыт и бесплатен, прогресс сохраняется.
Открыть курс