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

Обновлено: 21.11.2024

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

Предположим, у вас есть файл с именем company.txt, который содержит названия компаний. Этот файл содержит следующее содержимое.

Пример -1: Чтение содержимого файла из командной строки

Предположим, вы хотите прочитать файл company.txt построчно из командной строки без команды «cat». Выполните следующую команду, чтобы выполнить задачу. Цикл while будет читать каждую строку из файла company.txt на каждом шаге и сохранять содержимое строки в переменной $line, которая будет напечатана позже.

Пример 2. Чтение содержимого файла с помощью скрипта

Создайте файл bash и добавьте следующий код для чтения содержимого определенного файла. Здесь существующее имя файла хранится в переменной $filename, а переменная $n используется для хранения значения номера строки этого файла. Как и в предыдущем примере, цикл while используется для чтения этого файла с номером строки.

Выполните следующую команду, чтобы выполнить скрипт.

Выполните команду cat с файлом company.txt, чтобы отобразить исходное содержимое файла company.txt.

Пример -3: Передача имени файла из командной строки и чтение файла

Создайте файл bash и добавьте следующий скрипт. Этот скрипт возьмет имя файла из аргумента командной строки. Значение первого аргумента считывается переменной $1, которая будет содержать имя файла для чтения. Если файл существует в текущем местоположении, то цикл while будет читать файл построчно, как в предыдущем примере, и печатать содержимое файла.

Запустите приведенный выше скрипт с файлом employee.txt в качестве значения аргумента. Вывод покажет содержимое файла employee.txt, удалив лишнее пространство. Вы можете показать исходное содержимое файла employee.txt с помощью команды «cat».

Пример – 4. Чтение файла с пропуском обратной косой черты

Если вы хотите прочитать каждую строку файла, опуская обратную косую черту, вам нужно использовать параметр «-r» с командой чтения в цикле while.

Создайте файл с именем company2.txt с обратной косой чертой и выполните следующую команду, чтобы выполнить сценарий. В выводе будет показано содержимое файла без обратной косой черты.

Вам потребуется прочитать файл для многих целей программирования. Например, вы можете легко искать или сопоставлять любой конкретный контент из любого файла, читая каждую строку отдельно. Таким образом, это важная задача для любого программирования. В этом руководстве показаны несколько простых примеров чтения файла в сценарии bash. Это поможет вам получить представление о чтении содержимого файла построчно, используя цикл while в сценарии bash, и более эффективно применять его в вашем сценарии. Для получения дополнительной информации смотрите видео!

Об авторе

Фахмида Есмин

Я веду курсы веб-программирования. Мне нравится писать статьи или учебные пособия на различные темы в области ИТ. У меня есть канал на YouTube, на котором публикуются различные учебные пособия по Ubuntu, Windows, Word, Excel, WordPress, Magento, Laravel и т. д.: Справка Tutorials4u.

Дэйв Маккей

Дэйв Маккей
Писатель

Фатмавати Ахмад Заэнури/Shutterstock

Прочитать содержимое текстового файла Linux построчно в сценарии оболочки довольно легко, если вы имеете дело с некоторыми тонкими подводными камнями. Вот как это сделать безопасно.

Файлы, текст и идиомы

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

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

Знание и понимание идиом в одном языке также облегчает изучение нового языка программирования. Знание того, как вещи устроены в одном языке, и поиск эквивалента — или наиболее близкого — в другом языке — это хороший способ оценить сходства и различия между языками программирования, которые вы уже знаете, и тем, который вы изучаете.

Чтение строк из файла: однострочник

В Bash вы можете использовать цикл while в командной строке, чтобы читать каждую строку текста из файла и что-то делать с ней. Наш текстовый файл называется «data.txt». Он содержит список месяцев в году.

Наш простой однострочник:

Цикл while считывает строку из файла, и поток выполнения небольшой программы переходит к телу цикла. Команда echo записывает строку текста в окно терминала. Попытка чтения завершается неудачно, когда больше нет строк для чтения и цикл завершен.

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

Конечно, этот однострочник не очень полезен. Linux уже предоставляет команду cat, которая делает именно это за нас. Мы создали многословный способ замены трехбуквенной команды. Но он наглядно демонстрирует принципы чтения из файла.

До определенного момента это работает достаточно хорошо. Предположим, у нас есть еще один текстовый файл, содержащий названия месяцев. В этом файле escape-последовательность для символа новой строки добавлена ​​к каждой строке. Мы назовем его «data2.txt».

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

Экранирующий символ обратной косой черты «\» был удален. В результате к каждой строке добавляется «n». Bash интерпретирует обратную косую черту как начало управляющей последовательности. Часто мы не хотим, чтобы Bash интерпретировал то, что он читает. Может быть удобнее прочитать строку целиком — escape-последовательности с обратной косой чертой и все такое — и выбрать, что нужно разобрать или заменить самостоятельно в своем собственном коде.

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

Чтение строк из файла с помощью скрипта

Вот наш скрипт. Он называется «script1.sh».

Мы устанавливаем переменную Counter в ноль, затем определяем наш цикл while.

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

Мы могли бы установить это один раз вне цикла, точно так же, как мы устанавливаем значение Counter . Но с более сложными сценариями, особенно со многими определяемыми пользователем функциями, возможно, что IFS может быть установлен на другие значения в другом месте сценария. Убедившись, что IFS устанавливается в пустую строку каждый раз, когда повторяется цикл while, мы гарантируем, что мы знаем, каким будет его поведение.

Мы собираемся считать строку текста в переменную LinefromFile. Мы используем опцию -r (читать обратную косую черту как обычный символ), чтобы игнорировать обратную косую черту. С ними будут обращаться так же, как с любыми другими персонажами, и не получат никакого особого отношения.

Есть два условия, которые удовлетворяют циклу while и позволяют обрабатывать текст телом цикла:

  • read -r LinefromFile : когда строка текста успешно читается из файла, команда чтения отправляет сигнал об успехе в цикл while , а цикл while передает поток выполнения в тело цикла. Обратите внимание, что команда чтения должна видеть символ новой строки в конце строки текста, чтобы считать чтение успешным. Если файл не является текстовым файлом, совместимым с POSIX, последняя строка может не содержать символ новой строки. Если команда чтения увидит маркер конца файла (EOF) до того, как строка будет завершена символом новой строки, она не расценит это как успешное чтение. В этом случае последняя строка текста не будет передана в тело цикла и не будет обработана.
  • [ -n "$" ] : нам нужно проделать дополнительную работу для обработки файлов, несовместимых с POSIX.Это сравнение проверяет текст, который читается из файла. Если оно не завершается символом новой строки, это сравнение все равно вернет успех циклу while. Это гарантирует, что все фрагменты завершающей строки будут обработаны телом цикла.

Эти два предложения разделены логическим оператором ИЛИ » || ”, так что если какое-либо условие возвращает успех, полученный текст обрабатывается телом цикла, независимо от того, есть ли символ новой строки или нет.

В теле цикла мы увеличиваем переменную Counter на единицу и используем эхо для отправки некоторого вывода в окно терминала. Отображается номер строки и текст каждой строки.

Мы по-прежнему можем использовать наш прием перенаправления, чтобы перенаправить файл в цикл. В данном случае мы перенаправляем переменную $1, которая содержит имя первого параметра командной строки, переданного сценарию. Используя этот трюк, мы можем легко передать имя файла данных, с которым должен работать скрипт.

Скопируйте и вставьте сценарий в редактор и сохраните его с именем файла «script1.sh». Используйте команду chmod, чтобы сделать его исполняемым.

Давайте посмотрим, что сделает наш скрипт с текстовым файлом data2.txt и содержащимися в нем символами обратной косой черты.

Каждый символ в строке отображается дословно. Обратная косая черта не интерпретируется как управляющий символ. Они печатаются как обычные символы.

Передача строки в функцию

Мы по-прежнему просто отображаем текст на экране. В реальном сценарии программирования мы, вероятно, собирались сделать что-то более интересное со строкой текста. В большинстве случаев рекомендуется обрабатывать дальнейшую обработку строки в другой функции.

Вот как мы можем это сделать. Это «script2.sh».

Мы определяем нашу переменную Counter, как и раньше, а затем определяем функцию с именем process_line() . Определение функции должно появиться до того, как функция будет впервые вызвана в скрипте.

Наша функция будет передавать только что прочитанную строку текста в каждой итерации цикла while. Мы можем получить доступ к этому значению внутри функции, используя переменную $1. Если бы в функцию были переданы две переменные, мы могли бы получить доступ к этим значениям, используя $1 и $2, и так далее для большего количества переменных.

Цикл while в основном такой же. Внутри тела цикла есть только одно изменение. Эхо-строка заменена вызовом функции process_line(). Обратите внимание, что вам не нужно использовать скобки «()» в имени функции при ее вызове.

Имя переменной, содержащей строку текста, LinefromFile , при передаче в функцию заключается в кавычки. Это обслуживает строки, в которых есть пробелы. Без кавычек первое слово обрабатывается функцией как $1, второе слово считается как $2 и так далее. Использование кавычек гарантирует, что вся строка текста будет обрабатываться как $1. Обратите внимание, что это не тот же $1, который содержит тот же файл данных, переданный сценарию.

Поскольку счетчик был объявлен в основной части скрипта, а не внутри функции, на него можно ссылаться внутри функции process_line().

Скопируйте или введите приведенный выше сценарий в редактор и сохраните его под именем файла «script2.sh». Сделайте его исполняемым с помощью chmod :

Теперь мы можем запустить его и передать новый файл данных «data3.txt». В нем есть список месяцев и одна строка со многими словами.

Строки считываются из файла и по одной передаются в функцию process_line(). Все строки отображаются правильно, в том числе нечетная с пробелом, кавычками и несколькими словами в ней.

Строительные блоки полезны

Существует мнение, что идиома должна содержать что-то уникальное для этого языка. Это не то убеждение, с которым я согласен. Важно то, что он хорошо использует язык, легко запоминается и обеспечивает надежный и надежный способ реализации некоторых функций в вашем коде.

  • › Как использовать команду cut в Linux
  • › Как использовать команду Bash printf в Linux
  • › Худшее, что есть в телефонах Samsung, — это программное обеспечение Samsung.
  • › Что такое GrapheneOS и как она делает Android более приватным?
  • › Что означает XD и как вы его используете?
  • › Почему прозрачные чехлы для телефонов желтеют?
  • ›5 шрифтов, которые следует прекратить использовать (и лучшие альтернативы)
  • › Почему СМС должен умереть

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

Способ 1. Использование перенаправителя ввода

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

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

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

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

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

Пример сценария оболочки:

– Назначить путь к файлу переменной inputfile
– Пока цикл читает файл построчно
– -r предотвращает интерпретацию символов обратной косой черты
– IFS (внутренний разделитель полей) , если мы хотим разделить строку с помощью разделителя полей, необходимо указать значение разделителя (пример: если строка имеет значение типа «foo, bar» и мы хотим разделить запятую, тогда значение IFS должно быть (IFS=,))
- эхо поможет вывести содержимое на консоль
- как только будет достигнут конец файла, пока выйдет цикл

Заключение

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

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

Теги slug AutomationBash Script; $list = get_page_by_title('related', 'OBJECT', 'wp_show_posts'); wpsp_display($list->ID, 'tax_term="' . $cat_slug . '"' );*/ ?>

В некоторых случаях вам нужно прочитать файл построчно, и есть несколько способов прочитать файл в сценарии bash. Цикл while — лучший вариант для чтения файла построчно в Linux, и в этой статье мы покажем вам чтение файла построчно в сценарии bash с несколькими примерами, которые печатают каждую строку.

Основной синтаксис

Основной синтаксис для чтения файла построчно, как показано ниже:

пока IFS= читать -r строку
делать
выводить "$line"
готово

Где:

  • -r : этот параметр используется для предотвращения интерпретации символов обратной косой черты.
  • IFS: этот параметр используется для предотвращения обрезки начальных и конечных пробелов.
  • входной файл: это имя файла, который вы хотите прочитать построчно.

Создайте образец файла для тестирования

Для тестирования создайте образец файла с именем file.txt, как показано ниже:

Добавьте следующее содержимое:

Индия
Бангладеш
Пакистан
Австралия
Англия
Шриланка

Сохраните и закройте файл, когда закончите.

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

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

Давайте прочитаем файл file.txt построчно, используя цикл while, как показано ниже:

пока IFS= читать строку -r; выполнить эхо $line; готово

Эта команда будет считывать каждую строку из файла file.txt и сохранять содержимое строки в переменной $line, а затем распечатывать ее позже.

Индия
Бангладеш
Пакистан
Австралия
Англия
Шриланка

Чтение файла с помощью сценария Bash

Вы также можете создать сценарий bash и читать любой файл построчно.

Давайте создадим скрипт readfile.sh.

В этом примере переменная n используется для хранения значения номера строки файла, а цикл while используется для чтения этого файла с номером строки.

Добавьте следующее содержимое:

Сохраните и закройте файл, когда закончите.

Затем запустите скрипт, как показано ниже:

Вы должны увидеть следующий вывод:

Линия №1: Индия
Маршрут №2: Бангладеш
Линия №3: Пакистан
Линия №4: Австралия
Линия №5: Англия < br />Линия № 6: Шриланка

Передача имени файла в качестве аргумента и чтение файла

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

Давайте создадим скрипт readfile.sh.

Добавьте следующее содержимое:

Сохраните и закройте файл, когда закончите.

Затем запустите скрипт, как показано ниже:

Вы должны увидеть следующий вывод:

Индия — название страны
Бангладеш — название страны
Пакистан — название страны
Австралия — название страны
Англия — название страны
Шриланка — название страны

Чтение файла с помощью подстановки процесса

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

Давайте рассмотрим следующий пример.

Добавьте следующее содержимое:

Сохраните и закройте файл, когда закончите. Затем запустите скрипт, как показано ниже:

Вы должны увидеть следующий вывод:

Добро пожаловать в Индию
Добро пожаловать в Бангладеш
Добро пожаловать в Пакистан
Добро пожаловать в Австралию
Добро пожаловать в Англию
Добро пожаловать в Шри-Ланку

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

Здесь String позволяет передать несколько строк ввода в команду.

Давайте рассмотрим следующий пример:

Добавьте следующее содержимое:

Сохраните и закройте файл, когда закончите. Затем запустите скрипт, как показано ниже:

Вы должны увидеть следующий вывод:

Индия Бангладеш Пакистан Австралия Англия Шриланка

Заключение

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

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