Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Чтение файлов Основы командной строки

Ранее в курсе мы обсудили общее устройство файловой системы в POSIX-совместимых операционных системах.

Пора приступать к взаимодействию с файлами. В этом уроке рассмотрим различные способы чтения текстовых файлов.

Команда cat

Самый простой способ прочитать файл — команда 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 и 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.

Туда попадает ключевая информация о происходящих процессах в операционной системе и возникающих ошибках.

В WSL syslog не включен по умолчанию. Чтобы включить его, сперва установите его как:

sudo add-apt-repository ppa:adiscon/v8-stable
sudo apt-get install rsyslog

А затем запустите, используя команду sudo service rsyslog start.

Представим, что нам нужно изучить события, которые происходят часто. Знакомые команды в этой ситуации не помогут:

  • Пользоваться командой cat неудобно, потому что syslog слишком большой
  • Команда tail тоже не подойдет, потому что при высокой скорости записи логов мы рискуем пропустить часть события

В этой ситуации поможет tail, запущенный в особом режиме — с флагом -f.

Команда tail -f path/to/file не просто выводит последние строчки файла, но и ждет появления новых. Как только файл дописывается, tail сразу выводит на экран добавленные строки.

Среди наших примеров это первая команда, которая захватывает управление. Другими словами, после запуска она не заканчивает выполнение сразу, а продолжает работать, ожидая новые данные в файле, который выводится:

# Если у вас не хватает прав, чтобы смотреть файл 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.

Для остановки выполнения этой команды нажмите Ctrl + C.

Пейджеры

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

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

Пейджер less открывает файл и остается в этом режиме. Он позволяет производить поиск и перемещаться по файлу вперед и назад.

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

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

  • Выход — q
  • Вперед на страницу — f
  • Назад на страницу — b
  • Поиск введенного текста — вводим /, печатаем текст и нажимаем Enter
  • Переход к следующему совпадению — n
  • Переход к предыдущему совпадению — N

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


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 25 000 ₸ в месяц
Разработка фронтенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 7 ноября
профессия
от 25 000 ₸ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 7 ноября
профессия
от 14 960 ₸ в месяц
Ручное тестирование веб-приложений
4 месяца
с нуля
Старт 7 ноября
профессия
от 25 000 ₸ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 7 ноября
профессия
от 24 542 ₸ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 7 ноября
профессия
от 25 000 ₸ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 7 ноября
профессия
от 39 525 ₸ в месяц
Разработка фронтенд- и бэкенд-компонентов для веб-приложений
16 месяцев
с нуля
Старт 7 ноября
профессия
от 25 000 ₸ в месяц
Разработка бэкенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 7 ноября
профессия
новый
Автоматизированное тестирование веб-приложений на JavaScript
8 месяцев
c опытом
Старт 7 ноября

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»