Как "grep" выводить определенные диапазоны строк файла
Часто есть файлы grep -n whatev, чтобы найти то, что я ищу. Произвести вывод
1234: whatev 1
5555: whatev 2
6643: whatev 3
Если я хочу, чтобы просто извлечь строки между 1234 и 5555, есть ли инструмент для этого? Для статических файлов у меня есть script, который делает wc -l файла, а затем математика разбивает его на хвост и голову, но это не так хорошо работает с файлами журналов, которые постоянно записываются.
Ответы
Ответ 1
Попробуйте использовать 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 - прекрасный инструмент.)
Ответ 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