如何制作竖线| 在grep工作?

Mar*_*som 10 grep

这是我尝试过的 grep 命令行示例:

grep '(565172|565173|565175)' /var/log/cups/error_log
Run Code Online (Sandbox Code Playgroud)

它不会产生任何输出,即使所有 3 个值都在文件中多次。

我尝试逃离酒吧,这在某种程度上改善了情况 - 检测到中间值,但没有检测到第一个或最后一个。

grep '(565172\|565173\|565175)' /var/log/cups/error_log
Run Code Online (Sandbox Code Playgroud)

我也尝试过双重转义,但没有得到任何结果。

grep '(565172\\|565173\\|565175)' /var/log/cups/error_log
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?谢谢。

Ste*_*n D 17

您遇到的是基本正则表达式和扩展正则表达式之间的区别。从 grep 的手册页:

在基本的正则表达式中,元字符 ?、+、{、|、( 和 ) 失去了它们的特殊意义;而是使用反斜杠版本 \?、+、{、\|、( 和 )。

因此,您可以执行以下操作之一:

 grep '\(565172\|565173\|565175\)' /var/log/cups/error_log
Run Code Online (Sandbox Code Playgroud)

或者

grep -E '(565172|565173|565175)' /var/log/cups/error_log
Run Code Online (Sandbox Code Playgroud)

-E 标志打开“扩展”正则表达式。GNU grep 还支持与 perl 兼容的正则表达式。

  • 但是你添加了解释——我无法让它工作的原因是我只逃离了酒吧而不是parens。 (4认同)

Ada*_*tek 14

您尝试使用的语法属于扩展正则表达式,因此答案非常简单,使用egrep或包含-E标志。