日志排查中,我们需要查找除了某些特定错误日志之外的剩余错误日志,并打印上下文;
三个要求:

  1. 包含错误内容;
  2. 排除特定的错误日志;
  3. 打印上下文;

如果不需要打印上下文;可以采用如下:
grep 'XX' |grep -v 'YY'

如果需要打印上下文,必须先用正则表达式一次性匹配条件1和条件2的行,然后 -C 参数输出上下文;

正则表达式中,正向否定预查表达式(pattern1(?!pattern2))可以满足此要求;

参考https://www.runoob.com/regexp...中的描述:

正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
grep -P 才能支持此正则表达式;

正确写法如下:
grep -C 20 -P 'XX(?!.*YY)'

错误写法如下:
grep -C 20 -P 'XX.*(?!YY)'

正向否定预查,在任何不匹配pattern的字符串开始查找,比如待匹配字符串是"XX1111YY", 错误写法表达式下, 第三个字符1 也是不满足pattern的,从这个位置查找"XX" 是满足"XX.*"条件的, 所以最终匹配了所有XX的行;

现实的例子如: grep -C 20 -P 'ERROR(?!YY)'


zed2015
15 声望2 粉丝