Como posso copiar n linhas após as últimas duas ocorrências de uma string em um arquivo?

0

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  
    
por A. B 16.08.2017 / 21:51

3 respostas

1

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 
    
por 16.08.2017 / 22:19
1

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.

    
por 17.08.2017 / 00:13
0

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'
    
por 17.08.2017 / 00:58