Android

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

whatsaper ru Недетские анекдоты про Вовочку

whatsaper ru Недетские анекдоты про Вовочку

Оглавление:

Anonim

При написании сценариев 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]; then echo "$line" fi done < distros.txt

Ubuntu, apt Debian, apt

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

В следующем примере мы устанавливаем IFS в виде запятой ( , ) и передаем две переменные distro и pm в команду read. Все от начала строки до первой запятой будет присвоено первой переменной ( 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 мы можем прочитать файл построчно, указав имя файла в качестве входного для цикла чтения.

терминал bash