如何仅在模式的第一个匹配之后删除日志文件中的n行

时间:2019-10-17 14:01:09

标签: bash perl awk sed

我有一个日志文件,其中包含模式Fre --的多次重复。我只需要删除该模式的第一次出现以及此后的接下来的20行,并保持其他匹配不变。我需要在bash终端中执行此操作,最好使用sedawkperl。非常感谢您的帮助。

我尝试了

sed -e '/Fre --/,+20d' log.log

,但它将删除所有模式,然后删除其后的20行。我只希望删除第一个图案

这里有一个或多或少类似的问题和一些答案:How to remove only the first occurrence of a line in a file using sed,但我不知道如何更改它以在第一次比赛后删除20行

2 个答案:

答案 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