
Я пытаюсь найти в файле шаблон, и если он найден, я хочу увидеть строку и еще 10 строк результата.
до сих пор у меня есть
grep -n pattern file | cut -d: f1
теперь не уверен, как использовать этот вывод, чтобы сделать печать с такой логикой
sed -n result,(result+10)p file
вероятно, будет выпущено несколько экземпляров, если шаблон состоит из нескольких строк.
Любая помощь приветствуется.
решение1
если grep -A
не работает, попробуйте
awk '/pattern/ {for(i=0;i<number_of_lines;i++){print;getline}}' <filename>
иначе у sed есть другое грязное решение
sed -n '/pattern/ {p;n;p;n;p;...}' <filename>
здесь p-> print, n -> перейти на следующую строку. Так что число p — это число строк, которые нужно напечатать
Обновлять:
для использования в качестве функции напишите в test.sh
jobcheck(){
awk "/$1/"' {for(i=0;i<10;i++){print;getline}}' $2
}
тогда просто
source test.sh
бежать,
jobcheck "pattern" "file"
Обновление: согласно предложению Джонатана Леффлера, если какая-либо из следующих 10 строк содержит шаблон, подсчет следует начинать с этой строки, поэтому
pattern ->start printing from here to next 10 lines
blah
blah
pattern ->forget about the last 2 lines, start counting from here
blah
blah
Итак, обновленная команда awk будет выглядеть так:
awk '/pattern/{max_line=NR+2} {if(NR<=max_line) print}' <filename>
Аналогично будет изменен внутренний jobcheck. Ура:)
решение2
Используем grep 2.10:
grep -A 10 "pattern" your_file
выведет 10 строк после совпадения
-А число
--after-context=число
Вывести указанное количество строк конечного контекста после соответствующих строк.
Используя GNU awk 3.1.8:
awk '{if(a-->0) {print; next}} /pattern/{print; a=10}' your_file
решение3
Я бы использовал:
sed -n '/pattern/{N;N;N;N;N;N;N;N;N;N;p;}'
или
sed '1,/pattern/{/pattern/!d;}' | sed '12,$d'