grep“+”运算符不起作用

这个

ls -l /var/log | awk '{print $9}' | grep "^[az]*\.log." 

输出这个:

 alternatives.log.1 alternatives.log.10.gz alternatives.log.2.gz alternatives.log.3.gz alternatives.log.4.gz alternatives.log.5.gz alternatives.log.6.gz alternatives.log.7.gz alternatives.log.8.gz alternatives.log.9.gz apport.log.1 apport.log.2.gz apport.log.3.gz 

但是这个:

 ls -l /var/log | awk '{print $9}' | grep "^[az]+\.log." 

没有输出。

为什么? 我刚刚将*更改为+ 。 它不相似吗? 操作员+只需要至少一个匹配,并且*零或更多。

这是因为grep (没有任何参数)仅适用于标准正则表达式。 +是扩展正则表达式的一部分,因此要使用它,您需要使用grep -Eegrep

 ls -l /var/log | awk '{print $9}' | grep -E "^[az]+\.log." 

此外,如果您不想使用扩展正则表达式,则可以执行此操作:

 ls -l /var/log | awk '{print $9}' | grep "^[az][az]*\.log." 

要详细说明MiJyns的答案,像+这样的“特殊字符”也可以在标准正则表达式中工作,但是你需要用反斜杠来逃避它们。 您可能会说,标准和扩展正则表达式之间的默认期望是相反的:

在标准正则表达式中,字符默认情况下按字面匹配。 例如,在grep "ab+" ,+是文字+。 正则表达式将例如找到“ab + ab”,但不是“abbbb”。 要使用+的“特殊含义”,你需要逃避它。 所以grep "ab\+"会找到“abbb”,但不会再找到“ab + ab”。 因为在最后一个例子中,+被解释为量词“一个或多个”,在这种情况下是“一个或多个b”。

在扩展的正则表达式中,它恰恰相反。 在这里,您需要逃避“特殊字符”才能按字面意思对待。 所以grep -E "ab+"找到“abbb”,但不是“ab + ab”。 如果你逃脱了+,它会得到字面上的匹配。 所以grep -E "ab\+"找到“ab + ab”,但不是“abbb”。