如何解析日志文件中的字符串,并在找到时向后搜索另一个字符串

如何解析日志文件中的字符串,并在找到时向后搜索另一个字符串

我使用以下命令来解析日志文件中的特定字符串。然后我在日志中向后搜索以找到我真正想要的数据。问题如下例所示,我只返回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̲删除除 (!̲) 之外的每一行到下一行

答案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

相关内容