这是我尝试过的 grep 命令行的示例:
grep '(565172|565173|565175)' /var/log/cups/error_log
即使所有 3 个值多次出现在文件中,它也不会产生任何输出。
我尝试逃避酒吧,这在一定程度上改善了事情 - 检测到中间值,但不是第一个或最后一个。
grep '(565172\|565173\|565175)' /var/log/cups/error_log
我也尝试了两次转义,但返回没有结果。
grep '(565172\\|565173\\|565175)' /var/log/cups/error_log
我究竟做错了什么?谢谢。
答案1
您遇到的是基本正则表达式和扩展正则表达式之间的区别。来自 grep 的手册页:
在基本正则表达式中,元字符 ?、+、{、|、( 和 ) 失去了它们的特殊含义;而是使用反斜杠版本 \?、+、{、\|、( 和 )。
因此,您可以执行以下操作之一:
grep '\(565172\|565173\|565175\)' /var/log/cups/error_log
或者
grep -E '(565172|565173|565175)' /var/log/cups/error_log
-E 标志打开“扩展”正则表达式。 GNU grep 还支持与 perl 兼容的正则表达式。
答案2
您尝试使用的语法属于扩展正则表达式,因此答案非常简单,使用egrep
或包含该-E
标志。