В этой статье мы расскажем о том, как построчно читать файл в Bash.
Считывание файла построчным синтаксисом
Наиболее общий синтаксис для чтения файла построчно:
или эквивалентная однострочная версия:
Как это работает?
Входной файл ( input_file) – это имя файла, который вы хотите открыть командой для чтения read. Команда readчитает файл построчно, присваивая каждую строку переменной line. Как только все строки обработаны, цикл while прекратится. Внутренний разделитель полей (IFS) устанавливается в пустую строку, чтобы сохранить начальные и конечные пробелы, что является поведением команды по умолчанию read.
Чтение файла построчные примеры
Давайте посмотрим на следующий пример. Предположим, у нас есть файл с именем, distros.txt содержащий список некоторых наиболее популярных дистрибутивов Linux и менеджеры пакетов, разделенные запятой (,):
Чтобы прочитать файл построчно, вы должны запустить следующий код в вашем терминале:
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
вторник, 26 апреля 2011 г.
[bash] Построчное чтение файла и ssh
Пишем мы скрипт на баше, и нужно нам считать файл построчно, это делается вот так
Но вот нам потребовалось сделать в теле цикла что то по ssh. Мы смело вставляем нужный код
(представим что у нас настроена авторизация по открытому ключу).
И. и этот код будет работать не так как нам хотелось бы. Отработает только одна итерация цикла, не зависимо от того сколько строк в файле.
Проблема заключается в том что cat делает вывод в stdin из которого конвейером данные переходят в read. Но и ssh тоже использует stdin для своих целей и сливает все данные в себя (либо просто "забывает" их). И по когда управление будет снова передано на проверку условия, в stdin уже будет пусто и мы выйдем из цикла. Неожиданно ? да 🙂
Так как же нам решить эту проблему ? А вот так
Мы связываем файловый дескриптор №10 с нужным нам файлом. И далее производим чтение уже из этого потока.
1 комментарий:
А можно просто использовать:
ssh -n user@127.0.0.1 "ls"
Нашол такой вариант
cat /home/uzer/Name.csv | while read line
do
echo $line | cut -d ‘ ‘ -f1 #1-name
Но проблема в том что все отображается в купе а нужно по отдельности есть разделитель "," но помещая его в -d отображается как обычно, кто подскажет или я что то не так понял?
Всетаки нашол выход)
while read -r line
do
IFS=","
set — $line
username=$1
username2=$2
done более года назад