这个
ls -l /var/log | awk '{print $9}' | grep "^[a-z]*\.log."
Run Code Online (Sandbox Code Playgroud)
输出这个:
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
Run Code Online (Sandbox Code Playgroud)
但是这个:
ls -l /var/log | awk '{print $9}' | grep "^[a-z]+\.log."
Run Code Online (Sandbox Code Playgroud)
什么都不输出。
为什么?我刚换*
到+
。不是很相似吗?运算符+
只需要至少一个匹配项,*
零个或多个匹配项。
MiJ*_*Jyn 46
这是因为grep
(没有任何参数)仅适用于标准正则表达式。+
是扩展正则表达式的一部分,因此要使用它,您需要使用grep -E
or egrep
:
ls -l /var/log | awk '{print $9}' | grep -E "^[a-z]+\.log."
Run Code Online (Sandbox Code Playgroud)
此外,如果您不想使用扩展的正则表达式,您可以这样做:
ls -l /var/log | awk '{print $9}' | grep "^[a-z][a-z]*\.log."
Run Code Online (Sandbox Code Playgroud)
Hen*_*eck 15
要详细说明 MiJyns 的答案,像 + 这样的“特殊字符”也可以在标准正则表达式中使用,但是您需要使用反斜杠将它们转义。您可能会说,标准正则表达式和扩展正则表达式之间的默认期望是相反的:
在标准正则表达式中,字符默认按字面匹配。例如,在grep "ab+"
+ 中是文字 +。例如,正则表达式会找到“ab+ab”,而不是“abbbb”。要使用 + 的“特殊含义”,您需要对其进行转义。所以grep "ab\+"
会找到“abbb”,但不再找到“ab+ab”。因为在最后一个例子中,+ 被解释为量词“一个或多个那个”,在这种情况下是“一个或多个 b”。
在扩展的正则表达式中,情况正好相反。在这里,您需要转义“特殊字符”才能按字面意思处理。所以grep -E "ab+"
找到“abbb”,而不是“ab+ab”。如果你转义 +,它会按字面意思匹配。所以grep -E "ab\+"
找到“ab+ab”,而不是“abbb”。