我使用以下命令来解析日志文件中的特定字符串。然后我在日志中向后搜索以找到我真正想要的数据。问题如下例所示,我只返回50行。不知道我要查找的文本是否会向后 5 行、向后 200 行或更多。有没有一种方法可以在日志文件中搜索特定字符串,当找到该字符串时,然后在日志中向后搜索以找到第二个字符串,尽管不知道第二个字符串位于多远的位置。第一个字符串也可能多次出现。因此,对于第一个字符串的每个实例,我希望能够向后搜索以从第二个字符串收集数据。
grep -B50 "Server returned HTTP response code: 500 for URL:" LCSoap_8.log | \
tac | grep -P -o '(?<=qualified-src-dn=).*(?=src-dn)'
答案1
tac LCSoap_8.log | sed -n '
/Server returned HTTP response code: 500 for URL:/,/qualified-src-dn=.*src-dn/!d
s/.*qualified-src-dn=\(.*\)src-dn.*/\1/p'
或重复使用您的grep
:
tac LCSoap_8.log | sed '
/Server returned HTTP response code: 500 for URL:/,/qualified-src-dn=.*src-dn/!d' |
grep -Po '(?<=qualified-src-dn=).*(?=src-dn)'
sed '/A/,B/!d'
d̲删除除 (!̲) 之外的每一行A̲
到下一行B̲
。
答案2
这是基于类似问题的可能的基于 PCRE 的解决方案搜索一个模式并打印以另一个模式开头的前几行
grep -zPo '.*abc.*(?=(?s)(?(?!abc).)*?xyz)' file
abc
将输出包含在每个实例之前出现的最后一行xyz
例如给定一个文件
1 abc
2 abc
3 abc
4 abc
5 abc
6 bcd
7 cde
8 def
9 xyz
10 xyz
然后
$ grep -zPo '.*abc.*(?=(?s)(?(?!abc).)*?xyz)' file
5 abc