Прочитать файл
В Linux почти всё хранится в обычных текстовых файлах: настройки, журналы, списки. Поэтому умение быстро прочитать нужное и найти нужную строку — половина работы в терминале.
Короткий файл целиком — 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 — какие файлы виноваты.