无法从grep命令中排除单词

时间:2017-03-27 00:36:08

标签: linux bash grep

为了过滤日志文件中的错误,我有一个类似的命令

sudo grep -R --color=always -ri "err" *.log | grep -v "terry"

但输出并不是我想要的。我仍然看到像

这样的行
  

mail.log:Mar 27 10:31:44(删除)postfix / smtp [5449]:4EB0822348:to =,relay =(删除),delay = 6.6,延迟= 0.55 / 0.02 / 3.4 / 2.6,dsn = 2.0.0,status =已发送(250 OK id = 1csFlH-00010k-6T)

为什么在我排除" terry"从它?

1 个答案:

答案 0 :(得分:3)

你的“--color = always”就是你仍然得到结果的原因。请记住,管道将一个程序的stdout发送到另一个程序的stdin。第一个grep命令的输出是输出颜色。要将颜色输出到屏幕,您必须将颜色代码发送到shell。为了让shell将这些字符解释为颜色,它必须使用如下的转义码:

echo -e "This is \e[31mRed"

“红色”字样在回显时会显示为红色。所以grep将转义字符发送到第二个grep命令。继续通过将第一个grep命令重定向到文件然后检查文件来自行尝试。

grep -R --color=always -ri 'err' /tmp/log/syslog > /tmp/log/syslog2

现在在文本编辑器中打开文件(不要把文件拿出来,因为你只看到颜色)。

ar 26 10:30:59 zipmaster07 cinnamon-screensaver-dialog: pam_ecryptfs: seteuid ^[[01;31m^[[Kerr^[[m^[[Kor
Mar 26 14:27:19 zipmaster07 cinnamon-screensaver-dialog: pam_ecryptfs: seteuid ^[[01;31m^[[Kerr^[[m^[[Kor
t^[[01;31m^[[Kerr^[[m^[[Ky was here with an ^[[01;31m^[[Kerr^[[m^[[Kor.
mail.log:Mar 27 10:31:44 (removed) postfix/smtp[5449]: 4EB0822348: to=<t^[[01;31m^[[Kerr^[[m^[[Ky@(removed

线“terry @ ....”不再是特里,它是“t ^ [[01; 31m ^ [[Kerr ^ ....”并且“terry”的反向匹配不等于“ t ^ [[01; 31m ^ [[Kerr ^ ....“,因此grep包含它。

您需要删除颜色选项。

jschaeffer@zipmaster07 ~ $ grep -R -ri 'err' /tmp/log/sys2.log
pam_ecryptfs: seteuid err
pam_ecryptfs: seteuid err
terry was here with an error.
mail.log:Mar 27 10:31:44 (removed) postfix/smtp[5449]: 4EB0822348: to=<terry@(removed)>, relay=(removed), delay=6.6, delays=0.55/0.02/3.4/2.6, dsn=2.0.0, status=sent (250 OK id=1csFlH-00010k-6T)

现在使用第二个grep。

schaeffer@zipmaster07 ~ $ grep -R -ri 'err' /tmp/log/sys2.log | grep -v terry
pam_ecryptfs: seteuid err
pam_ecryptfs: seteuid err

希望这一切都有意义。