【问题标题】:How to remove n lines in a log file only after the first match of the pattern如何仅在模式的第一次匹配后删除日志文件中的 n 行
【发布时间】:2020-02-14 11:38:12
【问题描述】:

我有一个日志文件,其中包含多次重复的模式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 行

【问题讨论】:

标签: bash perl awk sed


【解决方案1】:

很确定有人会找到一个不错的sed 命令,但我更了解awk

你可以试试:

awk '/Fre --/ && !found++{counter=21}--counter<0' log.log

解释:

/Fre --/ -> 如果找到模式Fre --

&amp;&amp; !found++ -> 如果之前没有找到它

{counter=21} -> 将计数器值设置为 21(因为您要删除该行 + 接下来的 20 秒)

--counter&lt;0 -> 减少计数器并仅在计数器 时打印该行

正如@Sundeep 所述,@EdMorton 解决方案在处理非常大的文件时更安全。

awk '/Fre --/ && !found++{counter=21}!(counter&&counter--)' log.log

注意

如果要将删除的内容保存到原始文件中,则必须将awk 命令的内容复制到临时文件中,然后将临时文件移动到原始文件中。在编辑原始文件之前务必小心,因为您可能会丢失宝贵的信息。

先运行第一个命令:

awk '/Fre --/ && !found++{counter=21}!(counter&&counter--)' log.log > log.log.tmp

然后检查 .tmp 文件,如果 .tmp 文件看起来没问题,您可以运行第二个命令来应用更改:

mv log.log.tmp log.log

【讨论】:

  • 使用GNU sed,它会类似于sed '0,/Fre --/{//{N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;d}}' .. awk 更适合这里.. 但有一件事,如果输入文件足够大,您的计数器可能会导致问题有限精度
  • 可能有一个 sed 命令,但肯定不会很好:-)。
  • @EdMorton @Sundeep > 我试图将这两个命令结合起来,但找不到方法。 stackoverflow.com/questions/35700633/…stackoverflow.com/questions/4396974/…。像sed '0,/test3/{/test3/+3d}' file 这样的东西。我很惊讶不存在这样的解决方案。
  • 感谢@RaphaelSetin 添加有关如何实际删除原始文件中的行的信息。我更新了一些你的建议,因为我更喜欢避免显示可能删除 stackoverflow 上原始文件信息的命令。开发人员有时会复制/粘贴命令,可能会丢失宝贵的信息。
【解决方案2】:
$ 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

【讨论】:

  • 我在 Q&A 中尝试过类似的事情(我已将链接添加为书签)...在看到您的优化版本之前,我收到了 awk 'c&amp;&amp;c--{next} /3/&amp;&amp;!f{f=1; c=3; next} 1'
  • 它也可以像awk '/3/&amp;&amp;!f++{c=4}!(c&amp;&amp;c--)' 一样简单一点,但恕我直言,我们现在在清晰度上的权衡有点过分了!
  • @AminAlibakhshi 比我的大文件更安全的解决方案
猜你喜欢
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 2015-05-07
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
相关资源
最近更新 更多