使用grep匹配[error][critical]却匹配到[error][warning]的问题
grep匹配意外包含[warning]行的原因及解决办法
你用的grep -r "[error][critical]" .之所以会匹配到带[error][warning]的行,核心原因是grep默认使用正则表达式匹配,而你写的[error]和[critical]是正则里的「字符组」,不是字面意义的方括号加字符串。
字符组的作用是匹配组内的任意单个字符,比如[error]会匹配e、r、o中的任意一个(重复字符不影响),[critical]则匹配c、r、i、t、a、l中的任意一个。所以只要行里有[error],后面跟的字符属于[critical]字符组里的内容(比如warning里的r、i都在这个组里),就会被匹配到,这就是[error][warning]被命中的原因。
解决办法
有两种简单的方式修正这个问题:
- 方法一:使用固定字符串匹配模式
给grep加-F选项(等价于fgrep),让它把整个搜索内容当作普通文本,不解析正则语法:grep -rF "[error][critical]" . - 方法二:转义正则特殊字符
如果你不想用固定模式,就把方括号转义(在正则里,\[表示字面的[,\]表示字面的]),命令改成:grep -r "\[error\]\[critical\]" .
这两种方法都只会匹配包含[error][critical]的行,不会再命中[error][warning]的内容。
内容的提问来源于stack exchange,提问作者user2661518
相关产品推荐
相关产品推荐

