Как "вытащить" определенные диапазоны строк файла - PullRequest
46 голосов
/ 26 мая 2010

Часто я собираю файл grep -n whatev, чтобы найти то, что я ищу. Скажи, что вывод

1234: whatev 1
5555: whatev 2
6643: whatev 3

Если я хочу просто извлечь строки между 1234 и 5555, есть ли инструмент для этого? Для статических файлов у меня есть скрипт, который выполняет wc -l файла, а затем выполняет математические расчеты, чтобы разделить его с помощью tail & head, но он не очень хорошо работает с файлами журналов, в которые постоянно записываются.

Ответы [ 6 ]

72 голосов
/ 26 мая 2010

Попробуйте использовать sed, как указано на http://linuxcommando.blogspot.com/2008/03/using-sed-to-extract-lines-in-text-file.html. Например, используйте

sed '2,4!d' somefile.txt

для печати от второй строки до четвертой строки файла somefile.txt. (И не забудьте проверить, http://www.grymoire.com/Unix/Sed.html, Sed - замечательный инструмент.)

23 голосов
/ 29 апреля 2014

Следующая команда выполнит то, что вы просили «извлечь строки между 1234 и 5555» в someFile .

sed -n '1234,5555p' someFile

5 голосов
/ 07 июля 2016

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

awk '/whatev/ && NR >= 1234 && NR <= 5555' file

Вам не нужно запускать grep, а затем sed.

Perl однострочный:

perl -ne 'if (/whatev/ && $. >= 1234 && $. <= 5555') {print}' file
2 голосов
/ 02 мая 2018

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

sed "/First Line of Text/,/Last Line of Text/d" filename

, который удаляет все строки от первой совпавшей строки до последнего совпадения, включая эти строки.

Используйте sed -n с " p " вместо " d " для печати этих строк. Это гораздо полезнее для меня, так как я обычно не знаю, где эти строки.

0 голосов
/ 23 марта 2016

Если вы хотите строки вместо диапазонов строк, вы можете сделать это с помощью perl: например. если вы хотите получить строки 1, 3 и 5 из файла, скажите / etc / passwd:

perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd
0 голосов
/ 23 декабря 2012

Поместите это в файл и сделайте его исполняемым:

#!/bin/bash
start=`grep -n $1 < $3 | head -n1 | cut -d: -f1; exit ${PIPESTATUS[0]}`
if [ ${PIPESTATUS[0]} -ne 0 ]; then
    echo "couldn't find start pattern!" 1>&2
    exit 1
fi
stop=`tail -n +$start < $3 | grep -n $2 | head -n1 | cut -d: -f1; exit ${PIPESTATUS[1]}`
if [ ${PIPESTATUS[0]} -ne 0 ]; then
    echo "couldn't find end pattern!" 1>&2
    exit 1
fi

stop=$(( $stop + $start - 1))

sed "$start,$stop!d" < $3

Запустите файл с аргументами (учтите, что скрипт не обрабатывает пробелы в аргументах!):

  1. Начальный шаблон grep
  2. Остановка grep pattern
  3. Путь к файлу

Чтобы использовать с вашим примером, используйте аргументы: 1234 5555 myfile.txt

Включает строки с шаблоном запуска и остановки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...