Bash one liner - 如果匹配字符串,则从文件中获取行组

时间:2016-01-21 20:20:19

标签: bash awk sed grep

我有一个像<; p>这样的日志文件

A
some lines
some lines
Z
A
some lines
some lines
IMPORTANT text
some lines
Z
A
some lines
more lines
some lines
Z
A
some lines
IMPORTANT text
more lines
some lines
Z

如果它有重要字,我只需要A-Z之间的行。所以期望的输出是;

A
some lines
some lines
IMPORTANT text
some lines
Z
A
some lines
IMPORTANT text
more lines
some lines
Z

A-Z之间的行数是可变的。我尝试了太多的命令,如:

grep 'IMPORTANT' -A 3 -B 3 x.log | sed -n '/^A$/,/^Z$/p'
grep 'IMPORTANT' -A 3 -B 3 x.log | grep -E '^Z$' -B 5 | grep -E '^A$' -A 5

一些印刷不需要来自另一组的线,其他印刷线没有开始或结束点......所有都失败了。

有没有办法用一个班轮做这个?

2 个答案:

答案 0 :(得分:5)

使用gnu-awk可以:

awk 'BEGIN{RS=ORS="\nZ\n"} /^A/ && /IMPORTANT/' file
A
some lines
some lines
IMPORTANT text
some lines
Z
A
some lines
IMPORTANT text
more lines
some lines
Z
  • BEGIN{RS=ORS="\nZ\n"}将输入广告输出记录分隔符设置为Z,并在左侧添加换行符。
  • /^A/ && /IMPORTANT/确保每条记录都以A开头,并且其中包含IMPORTANT
  • 每个匹配都打印为awk
  • 中的默认操作

答案 1 :(得分:2)

使用sed:

(>>=)

说明:

join

这基本上会附加行,直到我们在模式空间中有一个完整的块,然后在匹配int aInt = (int)getpid(); char str[15]; sprintf(str, "%d", aInt); 时打印它,否则就丢弃它。

当我们到达周期结束时,sed -n '/^A$/{:a;N;/\nZ$/!ba;/IMPORTANT/p}' x.log 选项会阻止输出。

某些seds不支持使用命令分组(/^A$/ { # If line matches ^A$... :a # Label to branch to N # Append next line to pattern space /\nZ$/!ba # Branch to :a if pattern space doesn't end with \nZ /IMPORTANT/p # Print if pattern space contains IMPORTANT } IMPORTANT)或内联注释的oneliner。对于某些seds,-n代替{},而对于其他人,这(基本上是上面的减去评论)应该有效(并且符合POSIX):

;