Linux с чтение строк

Содержание
  1. Peter Leung, «Командная строка: маленькие хитрости от Linux Commando»
  2. Выбираем нужные строки из файла с помощью sed
  3. Команда read в Bash
  4. Встроенное read Bash
  5. Изменение разделителя
  6. Строка подсказки
  7. Назначьте слова в массив
  8. Выводы
  9. Как читать файл построчно в Bash
  10. Чтение файла построчно с синтаксисом
  11. Примеры чтения файла построчно
  12. Альтернативные методы чтения файлов
  13. Использование подстановки процесса
  14. Использование строки Here
  15. Использование дескриптора файла
  16. Выводы
  17. 🐧 Как читать файл построчно | скрипт Bash [3 метода]
  18. Метод 1: использование перенаправление ввода
  19. Метод 2: использование команды cat
  20. Как это устроено:
  21. 3. Использование имени файла в качестве аргумента
  22. Заключение
  23. Как обрабатывать файл построчно в сценарии Linux Bash
  24. Файлы, текст и идиомы
  25. Чтение строк из файла: однострочный
  26. Чтение строк из файла с помощью скрипта
  27. Передача строки функции
  28. Строительные блоки полезны

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Команда read в Bash

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

В этой статье мы рассмотрим встроенную команду read .

Встроенное read Bash

read — это встроенная команда bash, которая считывает строку из стандартного ввода (или из файлового дескриптора) и разбивает строку на слова. Первое слово присваивается первому имени, второе — второму имени и так далее.

Общий синтаксис встроенной функции read имеет следующий вид:

Чтобы проиллюстрировать, как работает команда, откройте терминал, введите read var1 var2 и нажмите «Enter». Команда будет ждать, пока пользователь введет данные. Введите два слова и нажмите «Enter».

Слова присваиваются именам, которые передаются команде read качестве аргументов. Используйте echo или printf чтобы проверить это:

Вместо того, чтобы вводить текст на терминале, вы можете передать стандартный ввод для read с помощью других методов, таких как piping, here-string или heredoc :

Вот пример использования строки здесь и printf :

Если команде read не задан аргумент, вся строка присваивается переменной REPLY :

Если количество аргументов, предоставленных для read , больше, чем количество слов, прочитанных из ввода, оставшиеся слова присваиваются фамилии:

В противном случае, если количество аргументов меньше количества имен, оставшимся именам присваивается пустое значение:

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

Ниже приведен пример, показывающий, как работает read при вызове с параметром -r и без него:

Как правило, вы всегда должны использовать read с параметром -r .

Изменение разделителя

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

Когда IFS установлен на символ, отличный от пробела или табуляции, слова разделяются ровно одним символом:

Строка разделена четырьмя словами. Второе слово — это пустое значение, представляющее отрезок между разделителями. Он создан, потому что мы использовали два символа-разделителя рядом друг с другом ( :: .

Для разделения строки можно использовать несколько разделителей. При указании нескольких разделителей присваивайте символы переменной IFS без пробела между ними.

Читайте также:  Командная строка mac os как установить

Вот пример использования _ и — качестве разделителей:

Строка подсказки

При написании интерактивных сценариев bash вы можете использовать команду read для получения пользовательского ввода.

Чтобы указать строку приглашения, используйте параметр -p . Подсказка печатается перед выполнением read и не включает новую строку.

Вот простой пример:

Как правило, вы будете использовать для read команды внутри в while цикл , чтобы заставить пользователя дать один из ожидаемых ответов.

Приведенный ниже код предложит пользователю перезагрузить систему :

Если сценарий оболочки просит пользователей ввести конфиденциальную информацию, например пароль, используйте параметр -s который сообщает read не печатать ввод на терминале:

Назначьте слова в массив

Чтобы присвоить слова массиву вместо имен переменных, вызовите команду read с параметром -a :

Когда даны и массив, и имя переменной, все слова присваиваются массиву.

Выводы

Команда read используется для разделения строки ввода на слова.

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

Источник

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

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

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

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

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

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

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

Входной файл ( 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 [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
Читайте также:  Windows не видит wifi модуль

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

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

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

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

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

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

Заключение

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

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

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

Источник

Как обрабатывать файл построчно в сценарии Linux Bash

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Nvidia 3090 driver linux

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ш hile петля в основном такая же. В теле цикла есть только одно изменение. В echo линия заменена вызовом process_line() функция. Обратите внимание, что вам не нужно использовать скобки «()» в имени функции, когда вы ее вызываете.

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

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

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

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

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

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

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

Источник

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