Поиск по сайту:
Кто не идет вперед, тот идет назад: стоячего положения нет (В.Г. Белинский).

Как читать файл построчно в Bash

21.05.2019
Как создать псевдонимы Bash

При написании сценариев Bash вы иногда окажетесь в ситуациях, когда вам нужно читать файл построчно. Например, у вас может быть текстовый файл, содержащий данные, которые должны обрабатываться сценарием.

В этой статье мы расскажем о том, как построчно читать файл в Bash.

 

Наиболее общий синтаксис для чтения файла построчно:

while IFS= read -r line
do
  echo "$line"
done < input_file

или эквивалентная однострочная версия:

while IFS= read -r line; do echo $line; done < input_file

Как это работает?

Входной файл ( input_file) — это имя файла, который вы хотите открыть командой для чтения read. Команда read читает файл построчно, присваивая каждую строку переменной line. Как только все строки обработаны, цикл while прекратится. Внутренний разделитель полей (IFS) устанавливается в пустую строку, чтобы сохранить начальные и конечные пробелы, что является поведением команды по умолчанию read.

 

Давайте посмотрим на следующий пример. Предположим, у нас есть файл с именем, distros.txt содержащий список некоторых наиболее популярных дистрибутивов Linux и менеджеры пакетов, разделенные запятой (,):

distros.txt
Ubuntu,apt
Debian,apt
CentOS,yum
Arch Linux,pacman
Fedora,dnf

Чтобы прочитать файл построчно, вы должны запустить следующий код в вашем терминале:

while IFS= read -r line
do
  echo "$line"
done < distros.txt

<

Код будет читать файл построчно, назначать строку переменной и выводить ее. По простоте вы увидите тот же вывод, что и при отображении содержимого файла с помощью команды cat.

Что если вы хотите распечатать только дистрибутивы, которые используют apt? Один из способов — проверить, содержит ли строка подстроку apt :

while IFS= read -r line
do
  if [[ "$line" == *"apt"* ]]; then
    echo "$line"
  fi
done < distros.txt
Ubuntu,apt
Debian,apt

При чтении файла строка за строкой вы также можете передать более одной переменной в команду чтения, которая разделит строку на поля на основе IFS. Первое поле присваивается первой переменной, второе — второй переменной и т. д. Если полей больше, чем переменных, оставшиеся поля присваиваются последней переменной.

В следующем примере мы устанавливаем IFS для запятой (,) и передаем две переменные distro и pm команде чтения. Все от начала строки до первой запятой будет присвоено первой переменной ( distro), а остальная часть строки будет назначена второй переменной ( pm):

while IFS=, read -r distro pm
do
  echo "$pm" менеджер пакетов для "$distro"
done < distros.txt
apt менеджер пакетов для Ubuntu
apt менеджер пакетов для Debian
yum менеджер пакетов для CentOS
pacman менеджер пакетов для Arch Linux
dnf менеджер пакетов для Fedora

Подстановка процесса позволяет вам передавать вывод команды в виде имени файла:

while IFS= read -r line
do
  echo "$line"
done < <(cat input_file )

Здесь строка является вариантом heredoc. Строка (cat input_file ) будет содержать новые строки:

while IFS= read -r line
do
  echo "$line"
done <<< $(cat input_file )

Вы также можете предоставить вход для цикла, используя дескриптор файла:

while IFS= read -r -u9 line
do
  echo "$line"
done 9< input_file

При работе с файловыми дескрипторами используйте число от 4 до 9, чтобы избежать конфликта с внутренними файловыми дескрипторами оболочки.

 

В Bash мы можем прочитать файл построчно, указав имя файла в качестве входного для цикла чтения.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в соц. сетях:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

2 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Олег

Ваш пример не читает последнюю строку в файле:

while IFS= read -r line
do
  echo "$line"
done < distros.txt
Кабан

В конце файла нужно оставить одно пустое поле

Читайте также

Спасибо!

Теперь редакторы в курсе.