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

How to Read a File Line By Line in Bash

14 Мая 2020 | Терминал

В этом руководстве мы расскажем о том, как построчно читать файл в 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? Один из способов - использовать оператор if и проверить, содержит ли строка подстроку 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" is the package manager for "$distro"
done < distros.txt
 
apt is the package manager for Ubuntu
apt is the package manager for Debian
yum is the package manager for CentOS
pacman is the package manager for Arch Linux
dnf is the package manager for Fedora
 

Альтернативные методы чтения файлов

Использование процесса замены 

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

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

Использование строки Here 

Здесь Строка является вариантом документа Здесь . Строка (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 мы можем прочитать файл построчно, указав имя файла в качестве входного для цикла чтения.


    Комментарии

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

Загрузка комментариев...