这
ls -l /var/log | awk '{print $9}' | grep "^[a-z]*\.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 "^[a-z]+\.log."
不输出任何内容。
为什么?我刚改成*
了+
。不是很相似吗?操作符+
只需要至少一个匹配,*
零个或多个。
答案1
这是因为grep
(不带任何参数) 仅适用于标准正则表达式。+
是扩展正则表达式的一部分,因此要使用它,您需要使用grep -E
或egrep
:
ls -l /var/log | awk '{print $9}' | grep -E "^[a-z]+\.log."
此外,如果您不想使用扩展正则表达式,您可以这样做:
ls -l /var/log | awk '{print $9}' | grep "^[a-z][a-z]*\.log."
答案2
详细阐述一下 MiJyns 的回答,“特殊字符”如 + 在标准正则表达式中也有效,但您需要使用反斜杠对其进行转义。您可能会说,标准正则表达式和扩展正则表达式之间的默认期望是相反的:
在标准正则表达式中,字符默认按字面匹配。例如,grep "ab+"
+ 中的 + 是字面 +。例如,正则表达式会找到“ab+ab”,但不会找到“abbbb”。要使用 + 的“特殊含义”,您需要对其进行转义。因此grep "ab\+"
会找到“abbb”,但不会再找到“ab+ab”。因为在最后一个例子中,+ 被解释为量词“一个或多个”,在这种情况下是“一个或多个 b”。
在扩展正则表达式中,情况恰恰相反。在这里,您需要转义“特殊字符”才能按字面处理。因此grep -E "ab+"
会找到“abbb”,但不会找到“ab+ab”。如果您转义 +,则会按字面匹配。因此grep -E "ab\+"
会找到“ab+ab”,但不会找到“abbb”。