Com o GNU grep:
s="STRINGIMLOOKINGFOR"
grep -Poz "$s"'.*(\n.*){3}' file | grep -v "$s" | tail -n 6
Text 10 Text 11 Text 12 Text 15 Text 16 Text 17
Existe uma maneira de copiar as primeiras n (digamos, 3) linhas depois que as últimas duas ocorrências de uma string são encontradas em um arquivo? Quando eu estava interessado apenas naqueles após a última ocorrência, usei:
grep -A4 'stringhere' filein.txt | tail -n 3 >> fileout.txt
No entanto, não sei como reescrever este comando para realizar a tarefa das duas últimas ocorrências da string.
i.e. Para um arquivo de entrada contendo:
Text 1
Text 2
Text 3
Text 4
STRINGIMLOOKINGFOR
Text 5
Text 6
Text 7
Text 8
Text 9
STRINGIMLOOKINGFOR
Text 10
Text 11
Text 12
Text 13
Text 14
STRINGIMLOOKINGFOR
Text 15
Text 16
Text 17
Text 18
Text 19
Eu gostaria que a saída (para n = 3) fosse:
Text 10
Text 11
Text 12
Text 15
Text 16
Text 17
Usando awk
:
awk '/^PATT$/{for(i=3;i;--i){getline;print}}' file|tail -n6
Acima, estamos procurando que as linhas inteiras coincidam com o padrão PATT
, em seguida, usando getline
to print
nas próximas 3 linhas depois disso e faça o tail -n6
para obter as últimas 6 linhas que são para as últimas 2 ocorrências do seu padrão.
Usando grep
grep -A3 --no-group-separator '^PATT$' file |grep -v "PATT" |tail -n6
Acima, procuramos o mesmo que acima e imprimimos -A3
nas próximas 3 linhas A após o padrão correspondido PATT
encontrado, excluindo as linhas com PATT
do resultado e fazer o rabo igual.
O --no-group-separator
é usado para grep não imprima o separador entre cada grupo de correspondências.
feio, mas acho que estou conseguindo a saída que você queria?
export n=3
grep -A$n STRINGIMLOOKINGFOR filein.txt | grep -v "^-" | grep -v STRINGIMLOOKINGFOR | tail -'expr $n \* 2'
Tags grep text-processing tail