Text-Processing

如何在文件中字元串的最後 2 次出現後複製 n 行?

  • August 17, 2017

在文件中找到字元串的最後 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  

使用 GNU grep:

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

使用awk

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

有了上面,我們正在尋找與 pattern 匹配的整行PATT,然後使用getline接下來print的 3 行並執行tail -n6以獲得最後 6 行,它們是您的模式的最後 2 行。

使用grep

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

有了上面,我們正在尋找與上面相同的內容並列印出-A3接下來的 3 行A找到匹配的模式PATT後,然後從結果中排除帶有PATT自身的行並執行相同的尾部。

--no-group-separator用於grep不列印每組匹配之間的分隔符。

引用自:https://unix.stackexchange.com/questions/386517