日志排查中,我们需要查找除了某些特定错误日志之外的剩余错误日志,并打印上下文;
三个要求:
- 包含错误内容;
- 排除特定的错误日志;
- 打印上下文;
如果不需要打印上下文;可以采用如下: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)'
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。