我试图在linux系统上搜索关键字的日志文件。
如果日志文件的结构出现在下面(它没有,但这是一个很好的例子),让我们假设我想找到“你好”这个词 和hello之上的日期和时间戳以及启动下一条记录的换行符上的所有其他行。
如何实现这一目标。
我唯一能想到的是一个grep Hello -B 1 logfile.log。 这当然会让我在匹配内容之前获得一行,但是直到新行之后的行。还试过grep Hello -B 1 -A 1 logfile.log
不确定如何获得不同的线条。请指教。提前谢谢。
[日志文件的结构]
2015-01-01 Hello| Bob | Billy| Tommy| 2015-01-01 Hello| Bob | Billy| Tommy| Judy| Richard| Paul| 2015-01-01 Tchau| Bob | Billy| Tommy| Judy| Jerry| Dwight| Phil|
[期望的输出]
2015-01-01 Hello| Bob | Billy| Tommy| 2015-01-01 Hello| Bob | Billy| Tommy| Judy| Richard| Paul|
答案 0 :(得分:2)
最简单的方法是使用gnu awk
并将RS
设置为空,将数据划分为块组。
awk -vRS= '/Hello/' ORS="\n\n" file
2015-01-01
Hello|
Bob |
Billy|
Tommy|
2015-01-01
Hello|
Bob |
Billy|
Tommy|
Judy|
Richard|
Paul|
如果组之间的空间不重要:
awk -vRS= '/Hello/' file
2015-01-01
Hello|
Bob |
Billy|
Tommy|
2015-01-01
Hello|
Bob |
Billy|
Tommy|
Judy|
Richard|
Paul|
答案 1 :(得分:1)
您需要在grep中使用-o
,-P
,-z
个参数。
$ grep -ozP '(?s)(?:\n\n|^)\K(?:(?!\n\n).)*Hello(?:(?!\n\n).)*' file
2015-01-01
Hello|
Bob |
Billy|
Tommy|
2015-01-01
Hello|
Bob |
Billy|
Tommy|
Judy|
Richard|
Paul|