如何在文件中最后 2 次出现字符串后复制 n 行?

如何在文件中最后 2 次出现字符串后复制 n 行?

在文件中找到最后 2 次出现的字符串后,有没有办法复制前 n(比如 3)行?当我只对上次发生后的那些感兴趣时,我使用了:

grep -A4 'stringhere' filein.txt | tail -n 3 >> fileout.txt

但是,我不知道如何重写此命令来执行字符串最后两次出现的任务。

即对于包含以下内容的输入文件:

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  

我希望输出(n=3)为:

Text 10  
Text 11  
Text 12  
Text 15  
Text 16  
Text 17  

答案1

使用 GNU grep:

s="STRINGIMLOOKINGFOR"
grep -Poz "$s"'.*(\n.*){3}' file | grep -v "$s" | tail -n 6
文字10  
文本11  
文本12  
文本15  
文本16  
文本17

答案2

使用awk

awk '/^PATT$/{for(i=3;i;--i){getline;print}}' file|tail -n6

在上面,我们正在寻找与模式匹配的整行PATT,然后使用getline之后print的下3行,并执行tail -n6获取模式最后2次出现的最后6行。

使用grep

grep -A3 --no-group-separator '^PATT$' file |grep -v "PATT" |tail -n6

有了上面的内容,我们正在寻找与上面相同的内容并打印出-A3接下来的 3 行A找到匹配的模式后PATT,然后从结果中排除与其PATT自身的行,并对尾部进行相同的处理。

--no-group-separator习惯于grep不要在每组匹配之间打印分隔符。

答案3

丑陋,但我想我得到了你想要的输出?

export n=3
grep -A$n STRINGIMLOOKINGFOR filein.txt | grep -v "^-" | grep -v STRINGIMLOOKINGFOR | tail -`expr $n \* 2`

相关内容