在Unix中过滤文件

时间:2015-07-28 20:46:49

标签: bash awk sed grep

我在过滤输出错误文件时遇到了很大问题。 日志文件:

Important some words flags
Line 1
Line 2
...
Line N
Important some words
Line 1
Line 2
...
Line N
Important some words
Line 1
Line 2
...
Line N
Important some words flags
Line 1
Line 2
...
Line N

所以,有些部分有“标志”字,而不是。

所需的输出文件是:

Important some words flags
Line 1
Line 2
...
Line N
Important some words flags
Line 1
Line 2
...
Line N

只有带有行的部分,哪一部分是通过“重要”启动并结束“标记”。

所有部分都有随机数行。

所以我不能使用类似的东西:

grep -B1 -P '!^Important*flags' logfile

因为我不知道该行之后/之前会有多少行......

2 个答案:

答案 0 :(得分:4)

有更简洁的方法来处理它,但这很清楚:

awk '/^Important.*flags$/ { p = 1; print; next }
     /^Important/         { p = 0;        next }
                          { if (p) print }'
  • 如果该行很重要且已标记,请将p设置为1,打印该行,然后跳到下一行。
  • 否则,如果该行很重要(但未标记),请将p设置为0并跳至下一行。
  • 否则,这是一条“不重要”的路线;如果p非零(这意味着标记了最后一条重要的行),则打印它。

第一行Important行前的任何行都会p 0,因此不会打印出来。

答案 1 :(得分:0)

perl -n0E 'say /(Important\N*flags.*?)(?=Important|$)/sg'