Чтение файла с конца linux

Как обрабатывать файл построчно в сценарии 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 быть пустой строкой.

Читайте также:  Спящий режим windows вредно ли это

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

Мы собираемся прочитать строку текста в переменной с именем 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() функция. Все строки отображаются правильно, в том числе нечетная с обратным пробелом, кавычками и несколькими словами.

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

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

Источник

Просмотр содержимого файлов в командной строке Linux

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

Команда cat

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

Это самый простой и наиболее часто используемый способ для вывода содержимого текстовых файлов. Но выводить большие файлы через cat не всегда удобно.

Команда nl

Команда nl действует аналогично команде cat , но выводит еще и номера строк в столбце слева.

Команду nl удобно применять для просмотра программного кода или поиска строк в файлах конфигурации.

Команда less

Утилита less выводит содержимое файла, но отображает его только в рамках текущего окна в режиме просмотра.

Вы можете прокручивать текст файла клавишами стрелок или перелистывать страницы клавишами w и z .

Для поиска текста внутри файла нажмите / .

Для просмотра списка доступных горячих клавиш нажмите h

Чтобы выйти из режима просмотра используется клавиша q .

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

Команда more

Команда more очень похожа на команду less . Она также выводит файл в терминале в режиме просмотра, но имеет некоторые отличия от команды less.

Например, less в конце файла выводит сообщение (END) (или EOF — End Of File) и ожидает нажатия клавиши q чтобы закрыть режим просмотра, а more по достижении конца файла сразу возвращает управление в терминал.

Также more после своей работы оставляет текст файла в терминале, а less работает «чисто» и не сохраняет текст в терминале.

Команда head

Команда head выводит на экран только первые 10 строк файла.

Используя опцию -n можно задать количество строк, которое нужно вывести. Например, чтобы вывести 15 строк используется команда:

Вместо -n можно просто использовать знак минус — , за которым сразу указывается количество строк.

Команда tail

Команда tail аналогична команде head , но выводит последние 10 строк файла.

Заключение

Команды, которые мы рассмотрели, имеют дополнительные возможности и области применения. Для получения справки по каждой команде можно воспользоваться Man-страницами.

Источник

Как вывести содержимое файла Linux? Открываем текстовый файл в Linux

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

Просмотр текстового файла в Linux полностью

Чтобы вывести содержимое всего текстового файла, в Linux используют команду cat. Она отлично походит для вывода небольших текстовых файлов, к примеру, конфигурационных файлов. Синтаксис прост:

Представьте, что надо посмотреть содержимое файла с названием myfile.txt:

Также можно вместо имени прописать адрес (путь) к файлу:

Если нужно посмотреть несколько файлов сразу, это тоже не вызовет проблем:

Кроме того, при просмотре текстового файла в Linux мы можем отобразить номера строк. Для этого потребуется всего лишь использовать опцию -n:

Команда nl функционирует аналогично команде cat с опцией -n, выводя номера строк в столбце слева.

При необходимости вы можете сделать так, чтобы при выводе текстового файла в конце каждой строки отображался символ $:

Вывод будет следующим:

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

Как просмотреть файл в Linux с прокруткой

Бывает, что текстовый файл большой, поэтому его содержимое не помещается в один экран. Использовать в таком случае cat неудобно, зато есть less. Синтаксис у неё такой же:

Команда less обеспечит постраничный просмотр, что очень удобно. При этом:
1) less позволяет просматривать текст по определённому числу строк, для чего достаточно указать — (тире или минус) и количество строк:

2) можно начать просмотр с конкретной строки в файле, указав + (плюс) и номер строки, с которой хотим начать чтение:

Открыв текст, мы можем управлять его просмотром:

Просматриваем начало или конец файла в Linux

Порой, нам не нужно выводить содержимое всего файла и мы хотим, к примеру, посмотреть лишь несколько строчек лога. Такое часто бывает, если мы подозреваем, что в начале или в конце конфигурационного файла есть ошибки. Для решения данного вопроса у нас существуют команды head и tail (как вы уже догадались, это голова и хвост).

Команда head по умолчанию показывает лишь 10 первых строчек в текстовом файле в Linux:

Вот, что мы увидим:

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

Если же вас не интересуют все 10 строчек, то, как и в случае с cat, можно использовать опцию –n, цифрой указывая число строк к выводу:

В итоге мы вывели только пять строк:

По правде говоря, букву n можно и не использовать, достаточно просто передать цифру:

Кстати, выводить содержимое текстового файла в Linux можно не построчно, а посимвольно. Давайте зададим число символов, которое нужно вывести (используем опцию -с):

Итак, выводим 45 символов:

Не верите, что их действительно 45? Проверить можно командой wc:

С «головой» разобрались, давайте поговорим про «хвост». Очевидно, что команда tail работает наоборот, выводя десять последних строк текстового Linux-файла:

Количество строк при выводе тоже можно менять. Однако в tail есть такая полезная опция, как -f. С её помощью содержимое текстового файла будет постоянно обновляться, в результате чего вы станете видеть изменения сразу (постоянно открывать и закрывать файл не придётся). Это весьма удобно, если вы хотите просматривать логи Linux в реальном времени:

Просматриваем содержимое файла по шаблону в Linux

На практике зачастую нам необходим не весь текстовый файл, а лишь несколько строк из него. Используя grep, мы можем вывести Linux-файл, предварительно отсеяв лишнее:

Команду можно применять и совместно с cat:

Давайте выведем из лога лишь предупреждения:

Есть и ряд полезных опций: -A, -B, -C. Допустим, нам надо выполнить вывод двух строк после вхождения enp2s0:

А теперь, то же самое, но до вхождения loop:

Можно по две строки как до, так и после loop:

Просматриваем Linux-файл в сжатом виде

Порой, в системе встречаются текстовые файлы в сжатом виде и формате gz. Это могут быть конфигурационные файлы ядра либо логи программ. Открыть такие файлы можно тоже через терминал, не прибегая к распаковке. Для этого существует множество аналогов вышеназванных утилит с той лишь разницей, что они имеют приставку z: zgerp, zegrep, zcat, zless.

Давайте откроем сжатый файл в Linux для просмотра:

Или выполним просмотр сжатого файла с прокруткой:

Вот, пожалуй, и всё. Теперь вы точно в курсе, как правильно открывать и просматривать текстовые файлы в терминале Linux.

Источник

Читайте также:  Клавиатурный тренажер под linux
Оцените статью