Вывести первую строку файла bash
При написании сценариев Bash вы иногда можете оказаться в ситуациях, когда вам нужно прочитать файл построчно. Например, у вас может быть текстовый файл, содержащий данные, которые должен обрабатывать сценарий.
В этом руководстве мы обсудим, как читать файл построчно в Bash.
Как использовать голову с другими командами
Команду head можно использовать в сочетании с другими командами, перенаправляя стандартный вывод из / в другие утилиты с помощью каналов.
Следующая команда будет хешировать переменную среды $RANDOM , отображать первые 32 байта и отображать случайную строку из 24 символов:
Выводы
К настоящему времени вы должны хорошо понимать, как использовать команду Linux head. Это дополнение к команде tail, которая выводит последние строки файла на терминал.
Выводы
В Bash мы можем читать файл построчно, используя цикл while и команду read .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Мне нужно получить строку 3 ( “ccccccc” )
Спасибо.
Если вы знаете, что вам нужна строка 3, один подход заключается в использовании head для получения первых трех строк и tail для получения только последней из них:
Другой подход, используя только Bash builtins, состоит в том, чтобы вызвать read три раза:
sed – ваш друг. sed -n 3p печатает третью строку ( -n : нет автоматической печати, 3p : печатать, когда номер строки – 3). Вы также можете иметь гораздо более сложные шаблоны, например sed -n 3,10p для печати строк с 3 по 10.
Если файл очень большой, вы можете подумать о том, чтобы не перебирать весь файл, а после печати. sed -n '3'
Здесь можно сделать это с помощью awk :
Объяснение:
- awk '. ' : вызывать awk, инструмент для управления файлами по очереди. Инструкции, заключенные одинарными кавычками, выполняются awk.
- FNR==3 : FNR означает “Записи номеров файлов”; просто подумайте об этом как о “количестве строк, прочитанных до сих пор для этого файла”. Здесь мы говорим, что если мы находимся на третьей строке файла, напечатаем всю строку, а затем немедленно выйдем из awk, чтобы не тратить время на чтение остального большого файла.
- file.txt : укажите входной файл в качестве аргумента awk для сохранения cat.
Есть много возможностей: Попробуйте:
Вот очень быстрая версия:
Разрешены ли другие инструменты, кроме bash? В системах, которые включают bash, вы обычно найдете sed и awk или другие базовые инструменты:
или если вы хотите оптимизировать это, убрав после чтения третьей строки:
или как насчет еще более простых инструментов (хотя и менее оптимизированных):
Конечно, если вы действительно хотите сделать это все в bash, вы все равно можете сделать его одним лайнером, не используя никаких внешних инструментов.
Существует много способов добиться того же. Выберите тот, который имеет смысл для вашей задачи. В следующий раз, возможно, объясните свои общие потребности немного лучше, чтобы мы могли дать вам ответы, более применимые к вашей ситуации.
Так как, как обычно, все остальные ответы включают тривиальные и обычные вещи (труба через grep , затем awk , затем sed , затем cut или you-name-it ), здесь очень необычное и (к сожалению) очень известный (так, я утверждаю, что у меня самый оригинальный ответ):
Я бы сказал, что это довольно эффективно ( mapfile достаточно эффективен и он встроен bash).
Мне нужно повторно удалить первую строку из огромного текстового файла с помощью скрипта bash.
сейчас я использую sed -i -e "1d" $FILE - но это занимает около минуты, чтобы сделать удаление.
есть ли более эффективный способ сделать это?
- оболочка усекает файл $FILE
- Shell создает новый процесс для tail
- оболочка перенаправляет stdout из
вы можете использовать-i для обновления файла без использования оператора'>'. Следующая команда удалит первую строку из файла и сохранит ее в файл.
для тех, кто находится на SunOS, который не является GNU, следующий код поможет:
нет, это примерно так же эффективно, как вы собираетесь получить. Вы можете написать программу на C, которая может выполнять эту работу немного быстрее (меньше времени запуска и обработки аргументов), но она, вероятно, будет стремиться к той же скорости, что и sed, когда файлы становятся большими (и я предполагаю, что они большие, если это займет минуту).
но ваш вопрос страдает от той же проблемы, что и многие другие, в том, что он предполагает решение. Если бы вы рассказали нам подробно что ты пытаешься делай скорее тогда как, мы можем предложить лучший вариант.
например, если это файл A, который обрабатывает какая-то другая программа B, одним из решений было бы не удалять первую строку, а изменить программу B, чтобы обработать ее по-другому.
предположим, что все ваши программы добавляют к этому файлу A и программа B в настоящее время читает и обрабатывает первую строку перед ее удалением.
вы можете перепроектировать программу B, чтобы она не пыталась удалить первая строка, но поддерживает постоянное (вероятно, файловое) смещение в файл A, чтобы при следующем запуске он мог искать это смещение, обрабатывать строку там и обновлять смещение.
затем, в спокойное время (полночь?), он может выполнить специальную обработку файла A, чтобы удалить все строки, которые в настоящее время обрабатываются, и установить смещение обратно в 0.
Это, безусловно, будет быстрее для программы, чтобы открыть и искать файл, а не открывать и переписывать. Это обсуждение предполагает, что вы иметь контроль над программой, разумеется. Я не знаю, так ли это, но могут быть и другие возможные решения, если вы предоставите дополнительную информацию.
вы можете редактировать файлы на месте: просто используйте perl -i флаг, как это:
это делает первую строку исчезают, как вы спрашиваете. Perl нужно будет прочитать и скопировать весь файл, но он организует для вывода, который будет сохранен под именем исходного файла.
Как сказал Пакс, вы, вероятно, не получите быстрее, чем это. Причина в том, что практически нет файловых систем, которые поддерживают усечение с начала файла, так что это будет O ( n операции), где n размер файла. Что вы можете сделать много быстрее, хотя перезаписать первую строку с тем же количеством байтов (возможно, с пробелами или комментарием), которые могут работать для вас в зависимости от того, что именно вы пытаетесь сделать (что такое это кстати?).
The sponge полезное позволяет избежать необходимости жонглирования временным файлом:
Бывает, что требуется удалить несколько символы в начале каждой строки в файлах, чтобы подогнать вывод информации под тот же *.json с помощью bash-скрипта. Можно напечатать часть строки между заданными первым и последним символами, используя команду cut или удалить последние символы в конце каждой строки с помощью хитрости и команды reverse .
Использование строки Here
Здесь String — это вариант документа Here . Строка (cat input_file ) сохраняет (cat input_file ) строки:
Как отобразить определенное количество байтов
Параметр -c ( --bytes ) позволяет распечатать определенное количество байтов:
Например, чтобы отобразить первые 100 байтов данных из файла с именем filename.txt , введите:
Вы также можете использовать суффикс множителя после числа, чтобы указать количество отображаемых байтов. b умножает его на 512, kB умножает на 1000, K умножает на 1024, MB умножает на 1000000, M умножает на 1048576 и так далее.
Следующая команда отобразит первые пять килобайт (2048) файла filename.txt :
Использование дескриптора файла
Вы также можете предоставить ввод в цикл, используя дескриптор файла:
При работе с файловыми дескрипторами используйте число от 4 до 9, чтобы избежать конфликта с внутренними файловыми дескрипторами оболочки.
Альтернативные методы чтения файлов
Как отображать несколько файлов
Если в качестве входных данных для команды head указано несколько файлов, она отобразит первые десять строк из каждого предоставленного файла.
Вы можете использовать те же параметры, что и при отображении одного файла.
В этом примере показаны первые 20 строк файлов filename1.txt и filename2.txt :
Если используется более одного файла, каждому выходному файлу предшествует заголовок с именем файла.
Как отобразить определенное количество строк
Используйте параметр -n ( --lines ), за которым следует целое число, указывающее количество отображаемых строк:
Вы можете опустить букву n и использовать только дефис ( - ) и цифру (без пробелов между ними).
Чтобы отобразить первые 30 строк файла с именем filename.txt , введите:
Следующее приведет к тому же результату, что и приведенные выше команды:
Примеры чтения файла построчно
Давайте посмотрим на следующий пример. Предположим, у нас есть файл с именем distros.txt содержащий список некоторых из самых популярных дистрибутивов Linux и их менеджеров пакетов, разделенных запятой ( , ):
Чтобы прочитать файл построчно, вы должны запустить в своем терминале следующий код:
Код читает файл за строкой, присваивает каждую строку переменной и печатает ее. По сути, вы увидите такой же результат, как если бы вы отображали содержимое файла с помощью команды cat .
Что, если вы хотите распечатать только дистрибутивы, в которых используется apt? Один из способов — использовать оператор if и проверить, содержит ли строка подстроку apt:
При чтении файла построчно вы также можете передать более одной переменной команде read , которая разделит строку на поля на основе IFS . Первое поле присваивается первой переменной, второе — второй переменной и так далее. Если полей больше, чем переменных, оставшиеся поля присваиваются последней переменной.
В следующем примере мы устанавливаем IFS в запятую ( , ) и передаем две переменные distro и pm команде read . Все от начала строки до первой запятой будет присвоено первой переменной ( distro ), а остальная часть строки будет присвоена второй переменной ( pm ):
Как использовать команду головы
В простейшей форме при использовании без каких-либо параметров команда head отобразит первые 10 строк.
2. Решение задачи.
2.1. Файл с примером текста.
Предварительно создадим файл со следующим содержимым и будем использовать его в примерах ниже.
Ответ:
Допустим нам необходимо удалить несколько символов с начала и с конца каждой строки этого файла.
2.2. Удалить первые N символов с начала каждой строки.
Используйте следующую команду чтобы удалить первые 5 символов каждой строки, то есть удаляем первые 5 символов и печатаем каждую строку, начиная с 6-ого символа:
Ответ:
2.3. Печать строки между заданными символами.
Используйте следующую команду чтобы напечатать содержимое каждой строки между 9-ым и 20-ым символами в bash-скрипте:
Ответ:
2.4. Печать первых N символов каждой строки.
Используйте следующую команду чтобы напечатать первые 20 символов каждой строки в bash-скрипте:
Ответ:
2.5. Удалить крайний символ каждой строки.
Используя сочетание команд reverse и cut , мы можем удалять последние N символов каждой строки, как показано ниже.
Используйте следующую команду чтобы удалить последний символ каждой строки в bash-скрипте:
Ответ:
2.6. Удалить крайние N символов каждой строки.
Используйте следующую команду чтобы удалить последние 8 символов каждой строки в bash-скрипте:
Ответ:
2.7. Удалить первый и крайний 1 символ с каждой стороны строки.
Используйте следующую команду чтобы удалить самый первый и самый крайний символ из всех строк файла:
Ответ:
Ответ:
2.8. Удалить первые и крайние 8 символов с каждой стороны строки.
Используйте следующую команду чтобы удалить первые 8 символов и 8 крайних символов из всех строк файла:
Команда head выводит первые строки (по умолчанию 10 строк) одного или нескольких файлов или передаваемых данных в стандартный вывод.
В этом руководстве мы объясним, как использовать утилиту head в Linux, на практических примерах и подробных объяснениях наиболее распространенных опций head.
Чтение файла построчно с синтаксисом
Наиболее общий синтаксис для построчного чтения файла следующий:
или эквивалентная однострочная версия:
Как это работает?
По умолчанию команда read интерпретирует обратную косую черту как escape-символ и удаляет все начальные и конечные пробелы, что иногда может вызвать неожиданное поведение. Чтобы отключить экранирование обратной косой черты, мы вызываем команду с параметром -r , а чтобы отключить обрезку, внутренний разделитель полей ( IFS ) очищается.
Мы используем [ printf ] вместо echo чтобы сделать код более переносимым и избежать нежелательного поведения. Например, если строка содержит такие значения, как «-e», она будет рассматриваться как опция эха.
Использование подстановки процесса
Подстановка процесса — это функция, которая позволяет использовать вывод команды в виде файла:
Синтаксис команды Head
Синтаксис команды head следующий:
- OPTION — варианты головы . Мы рассмотрим наиболее распространенные варианты в следующих разделах.
- FILE — Ноль или более имен входных файлов. Если ФАЙЛ не указан или если ФАЙЛ — - , head будет читать стандартный ввод.
Читайте также: