在文件中找到最后 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`