我有一个日志文件,其中包含模式Fre --
的多次重复。我只需要删除该模式的第一次出现以及此后的接下来的20行,并保持其他匹配不变。我需要在bash终端中执行此操作,最好使用sed
或awk
或perl
。非常感谢您的帮助。
我尝试了
sed -e '/Fre --/,+20d' log.log
,但它将删除所有模式,然后删除其后的20行。我只希望删除第一个图案
这里有一个或多或少类似的问题和一些答案:How to remove only the first occurrence of a line in a file using sed,但我不知道如何更改它以在第一次比赛后删除20行
答案 0 :(得分:1)
可以肯定,有人会找到不错的sed
命令,但我更了解awk
。
您可以尝试:
awk '/Fre --/ && !found++{counter=21}--counter<0' log.log
说明:
/Fre --/
->如果找到模式Fre --
&& !found++
->并且如果以前没有找到它
{counter=21}
->它将计数器值设置为21(因为您要删除该行+接下来的20s)
--counter<0
->减少计数器并仅在计数器<0时打印行
如@Sundeep所述,@ EdMorton解决方案在大文件上更安全。
awk '/Fre --/ && !found++{counter=21}!(counter&&counter--)' log.log
答案 1 :(得分:1)
$ seq 20 | awk '!f && /3/{c=4; f=1} !(c&&c--)'
1
2
7
8
9
10
11
12
13
14
15
16
17
18
19
20
请参见Printing with sed or awk a line following a matching pattern