Теперь, когда мы понимаем общее устройство файловой системы в POSIX совместимых ОС, пора приступать к взаимодействию с файлами. В этом уроке рассмотрим различные способы чтения текстовых файлов.

Самый простой способ прочитать файл — команда cat.

$ man cat

NAME
     cat -- concatenate and print files

SYNOPSIS
     cat [-benstuv] [file ...]

...

cat ожидает аргументы — пути до файлов, которые надо читать. В простейшем случае достаточно передать один путь, это довольно удобно, когда надо посмотреть содержимое небольшого файла:

$ cat .bash_logout
# ~/.bash_logout: executed by bash(1) when login shell exits.

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

Иногда бывает нужно посмотреть только начало файла или его конец, в такой ситуации помогают команды head и tail. Они тоже принимают на вход путь до файла, только head показывает первые 10 строк, а tail — последние 10 строк файла. Это поведение можно менять, задавая желаемое количество строк через опцию -n.

Head

$ head -n 2 .bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)

Tail

$ tail -n 2 .bashrc
  fi
fi

Некоторые файлы наполняются очень интенсивно. Например, так называемые "логи". Логи (иногда говорят "журналы") — это текстовые файлы, в которые заносится информация о происходящих процессах в определённой системе. В Linux логи лежат в каталоге /var/log. Туда пишет как сам Linux, так и большая часть установленных программ. Основной файл логов Linux называется syslog. Туда попадает ключевая информация о происходящих процессах в операционной системе и возникающих ошибках. Если события происходят часто и есть потребность анализировать их в процессе поступления, то команда cat оказывается неудобной, потому что syslog большой. Не подходит и простой запуск команды tail, потому что придётся запускать её каждую секунду и всё равно можно что-нибудь пропустить (если интенсивность записи событий в лог очень высокая).

В этой ситуации поможет tail, запущенный в особом режиме благодаря флагу -f. tail -f path/to/file не просто выводит последние строчки файла, но ждёт появления новых. Как только файл дописывается, tail сразу выводит на экран добавленные строки. Среди наших примеров это первая команда, которая захватывает управление, то есть после запуска она не заканчивает выполнение сразу, а продолжает работать, ожидая новые данные в файле, который выводится. Для остановки её выполнения нажмите Ctrl + C.

# Вероятно у вас не хватит прав смотреть файл syslog, чтобы получить к нему доступ,
# наберите sudo перед командой tail как показано ниже, в следующих уроках этот вопрос рассматривается подробнее
# Есть вероятность того что sudo попросить вас ввести пароль. Сделайте это и нажмите Enter. При наборе пароля
# курсор не будет двигаться, это сделано для безопасности.
$ sudo tail -f syslog
Aug 28 18:00:01 ip-10-0-1-223 systemd-udevd[15400]: Could not generate persistent MAC address for veth5c6ed9c: No such file or directory
Aug 28 18:00:01 ip-10-0-1-223 kernel: [126412.013499] device veth6969122 entered promiscuous mode
Aug 28 18:00:01 ip-10-0-1-223 systemd[1]: Starting Update resolvconf for networkd DNS...
Aug 28 18:00:01 ip-10-0-1-223 systemd-timesyncd[522]: Network configuration changed, trying to establish connection.
Aug 28 18:00:01 ip-10-0-1-223 systemd-timesyncd[522]: Synchronized to time server 91.173.73.198:123 (ntp.ubuntu.com).
Aug 28 18:00:01 ip-10-0-1-223 sh[15415]: sed: cant read /run/systemd/netif/leases/*: No such file or directory
Aug 28 18:00:01 ip-10-0-1-223 kernel: [126412.086162] IPv6: ADDRCONF(NETDEV_UP): veth6969122: link is not ready
Aug 28 18:00:01 ip-10-0-1-223 systemd-udevd[15403]: Could not generate persistent MAC address for veth6969122: No such file or directory
Aug 28 18:00:02 ip-10-0-1-223 systemd-timesyncd[522]: Network configuration changed, trying to establish connection.
Aug 28 18:00:02 ip-10-0-1-223 systemd-timesyncd[522]: Synchronized to time server 91.173.73.198:123 (ntp.ubuntu.com).
Aug 28 18:00:02 ip-10-0-1-223 systemd-timesyncd[522]: Network configuration changed, trying to establish connection.

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

# Снова придется воспользоваться sudo
$ sudo less syslog
# здесь много вывода

less открывает файл и остаётся в этом режиме. Он позволяет перемещаться по файлу вперёд и назад, производить поиск. Одна из отличительных особенностей пейджеров состоит в том, что они одинаково хорошо и быстро работают с файлами любых размеров. Всё потому, что пейджер не пытается загрузить в память весь файл до его отображения. Он грузит только ту часть, которая помещается на экран и при перемещении подгружает остальное.

less предоставляет несколько десятков команд для перемещения по тексту и его поиску, про большинство из них можно прочитать в соответствующем мануале. Здесь же затронем основные:

  • q — выход
  • f — вперёд на страницу
  • b — назад на страницу
  • если набрать /, затем начать вводить буквы и нажать Enter, то выполнится поиск введённого текста. Перемещение по найденным совпадениям выполняется командой n (переход к следующему совпадению) и командой N (переход к предыдущему совпадению).

Возможно, вы увидели сходство поведения пейджеров с тем, что мы наблюдали в мануалах. Открою секрет: когда мы запускали man, то перед нами открывался less с загруженным туда контентом. Как вы увидите позже, пейджеры невероятно популярны и неявно запускаются другими программами.