Подтвердить что ты не робот

Как "grep" выводить определенные диапазоны строк файла

Часто есть файлы grep -n whatev, чтобы найти то, что я ищу. Произвести вывод

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

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

4b9b3361

Ответ 2

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

sed -n '1234,5555p' someFile

Ответ 3

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

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

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

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

perl -ne 'if (/whatev/ && $. >= 1234 && $. <= 5555') {print}' file

Ответ 4

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

#!/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

Выполните файл с помощью аргументов (обратите внимание, что script не обрабатывает пробелы в аргументах!):

  • Запуск шаблона grep
  • Остановка шаблона grep
  • Путь к файлу

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

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

Ответ 5

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

perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd