Чтение файла по строкам linux

Содержание
  1. Peter Leung, «Командная строка: маленькие хитрости от Linux Commando»
  2. Выбираем нужные строки из файла с помощью sed
  3. Как читать файл построчно в Bash
  4. Чтение файла построчно с синтаксисом
  5. Примеры чтения файла построчно
  6. Альтернативные методы чтения файлов
  7. Использование подстановки процесса
  8. Использование строки Here
  9. Использование дескриптора файла
  10. Выводы
  11. Цикл по содержимому файла в Bash
  12. Ответ 1
  13. Ответ 2
  14. Ответ 3
  15. Ответ 4
  16. Чтение из файла с разделителями
  17. Чтение вывода другой команды с использованием подстановки процесса
  18. Чтение из ввода с разделителями NULL, например , find . -print0
  19. Чтение из более чем одного файла за раз
  20. Чтение всего файла в массив (версии Bash до 4)
  21. Как читать файл построчно в Bash
  22. How to Read a File Line By Line in Bash
  23. В этом руководстве мы расскажем о том, как построчно читать файл в Bash.
  24. Считывание файла построчным синтаксисом
  25. Чтение файла построчные примеры
  26. Альтернативные методы чтения файлов
  27. Использование процесса замены
  28. Использование строки Here
  29. Использование файлового дескриптора
  30. Вывод
  31. 🐧 Как читать файл построчно | скрипт Bash [3 метода]
  32. Метод 1: использование перенаправление ввода
  33. Метод 2: использование команды cat
  34. Как это устроено:
  35. 3. Использование имени файла в качестве аргумента
  36. Заключение

Peter Leung, «Командная строка: маленькие хитрости от Linux Commando»

Выбираем нужные строки из файла с помощью sed

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

Это очень просто сделать при помощи команды head:

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

Давайте попробуем команду sed ≈ редактор потока (STream Editor).

Моя первая попытка применить команду p (print) оказалась неудачной:

Обратите внимание, что редактор печатает весь файл, причем указанную первую строку печатает дважды. Почему? По умолчанию редактор перепечатывает на стандартный вывод каждую строку вводимого файла. Четко заданная команда 1p приказывает печатать первую строку. В итоге первая строка дублируется.

Чтобы этого не происходило нужно подавить дефолтный вывод при помощи опции -n, чтобы на выводе был только результат команды 1p:

Можно пойти другим путем и удалить из файла все строки, кроме первой:

где ‘1!d’ означает: если строка не является первой (!), то подлежит удалению. Обратите внимания на кавычки (одинарные). Они совершенно необходимы, так как без них конструкция 1!d вызовет последнюю запускавшуюся в шелле команду, начинающуюся с буквы d.

Для извлечения нескольких строк, скажем, со второй по четвертую, можно поступить одним из следующих способов:

Интервал обозначается через запятую включительно.

А если строки не идут друг за другом, например, с первой по вторую и еще четвертую?

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

Блестящий пример нестандартного подхода продемонстрировал в комментариях к этой статье некий Chris:

Если я хочу извлечь пятую строку файла, то делаю так:

А правда, здорово! И никаких заумных команд не надо с их километровыми манами. Кстати так и нужные блоки подряд идущих строк можно извлекать.

Источник

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

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

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

Чтение файла построчно с синтаксисом

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

Читайте также:  Проверка работы службы windows

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

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

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

По умолчанию команда read интерпретирует обратную косую черту как escape-символ и удаляет все начальные и конечные пробелы, что иногда может вызвать неожиданное поведение. Чтобы отключить экранирование обратной косой черты, мы вызываем команду с параметром -r , а чтобы отключить обрезку, внутренний разделитель полей ( IFS ) очищается.

Мы используем [ printf ] вместо echo чтобы сделать код более переносимым и избежать нежелательного поведения. Например, если строка содержит такие значения, как «-e», она будет рассматриваться как опция эха.

Примеры чтения файла построчно

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

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

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

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

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

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

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

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

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

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

Здесь String — это вариант документа Here . Строка (cat input_file ) сохраняет (cat input_file ) строки:

Использование дескриптора файла

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

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

Выводы

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

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

Источник

Цикл по содержимому файла в Bash

Как мне в цикле перебрать каждую строку текстового файла с помощью Bash ?

Я использую следующий скрипт:

for p in (peptides.txt)

Я получаю такой вывод на экране:

./runPep.sh: line 3: синтаксическая ошибка – неожиданная лексема «(‘

./runPep.sh: line 3: «for p in (peptides.txt)’

Ответ 1

Один из способов сделать это:

while read p; do

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

while IFS=»» read -r p || [ -n «$p» ]

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

while read -u 10 p; do

Здесь 10 — это просто произвольное число (отличное от 0, 1, 2).

Ответ 2

Вариант 1: используя цикл while — по одной строке за раз: перенаправление ввода:

Читайте также:  Linux games on switch

while read p; do

Вариант 2: цикл while — открыть файл, прочитать из файлового дескриптора (в данном случае файлового дескриптора №4).

while read -u4 p ; do

Ответ 3

Еще один способ выполнить данную операцию :

for word in $(cat peptides.txt); do echo $word; done

Этот формат позволяет поместить все это в одну командную строку. Изменяя часть «echo $word», вы можете выполнить несколько команд, разделенных точкой с запятой. В следующем примере содержимое файла используется в качестве аргументов двух других сценариев:

for word in $(cat peptides.txt); do cmd_a.sh $word; cmd_b.py $word; done

Или, если вы собираетесь использовать это как редактор потока (используя sed), можно выгрузить вывод в другой файл следующим образом:

for word in $(cat peptides.txt); do cmd_a.sh $word; cmd_b.py $word; done > outfile.txt

Если у вас есть пробелы, которые вы не хотите разделять словами/строками, это становится немного сложнее, но та же команда по-прежнему работает следующим образом:

OLDIFS=$IFS; IFS=$’\n’; for line in $(cat peptides.txt); do cmd_a.sh $line; cmd_b.py $line; done > outfile.txt; IFS=$OLDIFS

Этот пример указывает оболочке разделять символы по строкам.

Ответ 4

Еще несколько возможных решений:

Чтение из файла с разделителями

# ‘:’ является разделителем, и на каждой строке в файле име ю тся три поля

# IFS, установленный ниже, ограничен контекстом `read`, он не влияет на любой другой код

while IFS=: read -r field1 field2 field3; do

# если строка содержит менее трех полей, то недостающие поля будут установлены в пустую строку

# если строка имеет более трех полей, `field3` получит все значения, включая третье поле плюс разделитель(и)

Чтение вывода другой команды с использованием подстановки процесса

while read -r line; do

Этот подход лучше, чем command . | while read -r line; do . потому, что цикл while здесь выполняется в текущей оболочке, а не в подоболочке.

Чтение из ввода с разделителями NULL, например , find . -print0

while read -r -d » line; do

# использование второй строки ‘read .

Чтение из более чем одного файла за раз

while read -u 3 -r line1 && read -u 4 -r line2; do

# обратите внимание, что цикл завершится, когда мы достигнем EOF в любом из файлов

Для совместимости с POSIX каждый вызов будет выглядеть примерно так read -r X .

Чтение всего файла в массив (версии Bash до 4)

while read -r line; do

Если файл заканчивается неполной строкой (в конце отсутствует новая строка), то:

Источник

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

How to Read a File Line By Line in Bash

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

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

Считывание файла построчным синтаксисом

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

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

Чтение файла построчные примеры

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

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

Читайте также:  Mac os github app

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

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

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

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

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

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

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

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

Использование файлового дескриптора

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

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

Вывод

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

Источник

🐧 Как читать файл построчно | скрипт Bash [3 метода]

В этой статье мы изучим 3 метода в сценарии bash для чтения файла построчно.

Метод 1: использование перенаправление ввода

Самый простой способ прочитать файл построчно – использовать перенаправитель ввода в цикле while.

Чтобы продемонстрировать, мы создали образец файла с именем mycontent.txt и будем использовать его в этом руководстве.

Давайте создадим скрипт с именем example1.sh, который использует перенаправление ввода и цикл.

Как это устроено:

  • – Объявление оболочки “bash”
  • – Запуск цикла while и сохранение содержимого строки в переменной «y»
  • – Часть цикла while (начальная точка) – echo для вывода, а «$ y» означает вывод значения переменной, т.е. строки
  • – Чтение содержимого файла с помощью перенаправителя ввода «

Выполнение скрипта и вывод:

Метод 2: использование команды cat

Второй метод – использовать команду cat и затем отправлять ее вывод в качестве входных данных в цикл while, используя pipe.

Создайте файл скрипт example2.sh с таким содержанием:

Как это устроено:

  • – Объявление оболочки “bash”
  • – Вывод команды cat, отправленной как вход в цикл while с использованием пайпа «|» и сохранение содержимого строки в переменной «y»
  • – Часть цикла while (начальная точка) – echo для вывода, а «$ y» означает вывода значения переменной, т.е. строки
  • – Завершение цикла while с done

Совет: мы можем объединить все команды и использовать их как одинарные.

3. Использование имени файла в качестве аргумента

Этот третий метод отправляет имя файла в качестве входного аргумента через командную строку.

Создайте файл скрипта с именем example3.sh, как:

Как это устроено:

  • – Объявление оболочки “bash”
  • – Запуск цикла while и сохранение содержимого строки в переменной «y»
  • – Часть цикла while (начальная точка) – echo для вывода, а «$ y» означает вывод значения переменной, т.е. строки
  • – Чтение содержимого файла из аргумента командной строки, то есть $1, с использованием перенаправителя ввода «

Заключение

В этом руководстве объясняется, как читать содержимое файла построчно, используя скрипт оболочки bash с примерами.

Это помогает искать строки в нужном файле, читая строки по отдельности.

Спасибо за прочтение, оставляйте свои предложения и отзывы в разделе комментариев.

Источник

Оцените статью