我正在运行以下命令: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
你看到的原因grep和ps-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 匹配自身,并且您应该只会在输出中看到相关的行。