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

nan*_*.tr 1 bash awk grep sed

我有一个日志文件,像;

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
Run Code Online (Sandbox Code Playgroud)

如果它有重要的单词,我只需要AZ之间的行.所以期望的输出是;

A
some lines
some lines
IMPORTANT text
some lines
Z
A
some lines
IMPORTANT text
more lines
some lines
Z
Run Code Online (Sandbox Code Playgroud)

AZ之间的行数是可变的.我尝试了太多的命令,如:

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
Run Code Online (Sandbox Code Playgroud)

一些印刷不需要来自另一组的线,其他印刷线没有起点或终点......而且都失败了.

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

anu*_*ava 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
Run Code Online (Sandbox Code Playgroud)
  • BEGIN{RS=ORS="\nZ\n"}将输入广告输出记录分隔Z符设置为两侧的换行符.
  • /^A/ && /IMPORTANT/确保每条记录以其开头A并具有IMPORTANT.
  • 每个匹配都打印为默认操作 awk