当前位置: 首页 > Linux

grep包含xx但不包含yy正则表达式

时间:2023-04-06 04:46:42 Linux

在日志排查中,我们需要找到除某些特定错误日志之外的其余错误日志并打印上下文;三要求:包含错误内容;排除特定的错误日志;打印上下文;如果您不需要打印上下文;可以使用如下:grep'XX'|grep-v'YY'如果需要打印上下文,必须先用正则表达式一次性匹配条件1和条件2的行,然后-C参数输出上下文;在正则表达式中,正负查找表达式(pattern1(?!pattern2))可以满足这个要求;参考https://www.runoob.com/regexp...中的描述:Forward一个否定断言,匹配任何不匹配pattern的字符串开头的搜索字符串。这是一个非获取匹配,即匹配不需要获取以备后用。例如,“Windows(?!95|98|NT|2000)”可以匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。Lookaheads不消耗字符,也就是说,在匹配发生后,搜索下一个匹配项会在最后一个匹配项之后立即开始,而不是在包含lookahead的字符之后。只有grep-P可以支持这个正则表达式;正确的写法是:grep-C20-P'XX(?!.*YY)'错误的写法是:grep-C20-P'XX.*(?!YY)'正负预检,开始搜索任何不符合模式的字符串,例如要匹配的字符串是“XX1111YY”,在拼写错误的表达式下,第三个字符1不满足模式,并搜索for"XXfromthisposition"满足"XX.*"条件,所以最终匹配到所有XX行;一个现实的例子是:grep-C20-P'ERROR(?!YY)'