imprima uma linha específica e mais um pouco

imprima uma linha específica e mais um pouco

Estou tentando procurar um padrão em um arquivo e, se ele for encontrado, quero ver a linha e mais 10 linhas do resultado.

até agora eu tenho

grep -n pattern file | cut -d: f1 

agora não tenho certeza de como usar essa saída para fazer a impressão com a lógica como

sed -n result,(result+10)p file

provavelmente haverá alguns emitidos se o padrão estiver em várias linhas.

Qualquer ajuda é apreciada

Responder1

se grep -Anão estiver funcionando, tente

awk '/pattern/ {for(i=0;i<number_of_lines;i++){print;getline}}' <filename>

senão sed tem outra solução suja

sed -n '/pattern/ {p;n;p;n;p;...}' <filename>aqui p-> imprimir, n -> ir para a próxima linha. Então o número de p é o seu número de linhas a serem impressas

Atualizar:

para usar como uma função, escreva um test.sh

jobcheck(){
  awk "/$1/"' {for(i=0;i<10;i++){print;getline}}' $2
}

então apenas

source test.sh

para correr,

jobcheck "pattern" "file"

Atualização: conforme sugestão de Jonathan Leffler, se alguma das próximas 10 linhas contiver o padrão, a contagem deverá começar a partir dessa linha, então

pattern  ->start printing from here to next 10 lines
blah
blah
pattern  ->forget about the last 2 lines, start counting from here
blah 
blah

Então o comando awk atualizado será como

awk '/pattern/{max_line=NR+2} {if(NR<=max_line) print}' <filename>

Da mesma forma, dentro do jobcheck também será alterado. Saúde:)

Responder2

Usando grep 2.10:

grep -A 10 "pattern" your_file

imprimirá 10 linhas após a partida

Depágina de manual do grep:

-Um número

--after-context=num

Imprime num linhas do contexto final após as linhas correspondentes.

Usando GNU awk 3.1.8:

awk '{if(a-->0) {print; next}} /pattern/{print; a=10}' your_file

Responder3

Eu usaria:

sed -n '/pattern/{N;N;N;N;N;N;N;N;N;N;p;}'

ou

sed '1,/pattern/{/pattern/!d;}' | sed '12,$d'

informação relacionada