我有一个像<; 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
一些印刷不需要来自另一组的线,其他印刷线没有开始或结束点......所有都失败了。
有没有办法用一个班轮做这个?
答案 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):
;