更优雅的 ps aux | grep [g]rep 不起作用

更优雅的 ps aux | grep [g]rep 不起作用

我正在运行以下命令:ps -ef | grep [p]ts/1

结果是:

root 13820 1733 0 14:19 ? 00:00:00 sshd: root@pts/1 root 13822 13820 0 14:19 pts/1 00:00:00 -bash root 15847 13822 0 15:32 pts/1 00:00:00 ps -ef root 15848 13822 0 15:32 pts/1 00:00:00 grep [p]ts/1

它为何返回grep并且ps

PS 单引号和双引号给出的结果相同。我可以在不使用“grep”的grep -v grep情况下获得输出,但我想使用更优雅的方式。

答案1

grep仅显示与您指定的正则表达式匹配的行。

您显示的每一条输出行实际上都包含文本“pts/1”,只是可能不在您预期的位置,即在那些“意外”行上的控制 tty 列中。

正如 thrig 的评论所说,你最好选择pgrep

答案2

你看到的原因grepps-ef输出中的进程是因为 grep 命令本身与您提供的模式匹配,[p]ts/1

方括号[页]模式中的一种方式可以防止 grep 在输出中匹配其自己的进程。让我分解一下这个模式[p]ts/1

所以当你跑步的时候ps -ef | grep [p] ts/1, 这grep过程本身与模式 [p]ts/1 匹配,您会在输出中看到它。

避免这种情况的一种方法是使用-E选择grep启用扩展正则表达式,然后修改您的模式:

ps -ef | grep -E 'pts/1$'

root     13820  1733  0 14:19 ?        00:00:00 sshd: root@pts/1

使用这种方法,您将不需要使用方括号来阻止 grep 匹配自身,并且您应该只会在输出中看到相关的行。

相关内容