我在使用grep和管道时遇到问题。方案如下:
我正在运行一个python脚本,它输出(使用print)到屏幕调试消息。我使用./prog | grep "\[\[\[\["
来捕获字符串,其中包含“[[[[”)。它返回几个匹配的结果但不返回其他结果(另一个观察结果:grep找到的结果在文件中的grep找不到结果之前)。我运行./prog
没有管道和grep,它输出所有字符串“[[[[”pattern。
答案 0 :(得分:3)
问题是左方括号是正则表达式中的特殊字符。 “grep”不仅仅是一个字符串匹配器。正则表达式是一种涉及的语言,可用于描述文本模式。 Grep试图将[[[[
解释为正则表达式,而不仅仅是字符串。
正如您的问题主题所示,您通常可以使用反斜杠转义特殊字符。所以以下内容可能有效:
./prog | grep '\[\[\[\['
您也可以通过将放在方括号内来“转义”方括号。因此,[[][[][[][[]
或[[]{4}
如果您的grep版本处理它。
您还需要确定您的程序./prog
是否正在将输出发送到“标准输出”或“标准错误”。您可以将所有stderr放在管道中:
./proc 2>&1 | egrep '[[]{4}'
<强>更新强>
[ghoti@pc ~]$ printf '[[[[\n[[[\n[[[[\n[[[[[\n[[\n' | grep '\[\[\[\['
[[[[
[[[[
[[[[[
[ghoti@pc ~]$ printf '[[[[\n[[[\n[[[[\n[[[[[\n[[\n' | egrep '[[]{4}'
[[[[
[[[[
[[[[[
[ghoti@pc ~]$
显然,我的结果与你的不符。如果您可以提供有关正在处理的数据的更多详细信息,那么尝试复制结果会很有帮助。
答案 1 :(得分:2)
错误消息通常会发送到stderr
,而不是stdout
;您的管道正在过滤stdout
。 (您的“另一个观察结果”暗示了这一点。)您可以将stderr
和stdout
一起重定向到管道:
./prog 2>&1 | grep '\[\[\[\['