`ps | 中第二个 grep 的功能grep -v | | grep -v | grep`

`ps | 中第二个 grep 的功能grep -v | | grep -v | grep`
ps aux  | grep firefox

列出具有字符串“firefox”的所有进程

ps aux  | grep -v firefox

列出所有不带字符串“firefox”的进程

ps aux | grep -v grep | grep firefox

第二个 grep 的作用是什么? grep 本身是一个命令,那么为什么我们要 grep 另一个 grep 呢?

答案1

当您执行诸如以下命令时

ps aux  | grep firefox

然后是grep过程本身可能会显示在输出中,因为您要查找的单词已存在。例如在我的机器上我运行chrome并得到类似的结果:

% ps aux | grep chrome
sweh      3384  0.0  0.0  11128  1024 pts/1    S+   07:08   0:00 grep chrome
sweh     23698  0.0  0.0   6384   620 ?        S    Jul04   0:00 /usr/lib/chromi

我们可以看到进程 3384 是grep命令并且匹配,因为单词铬合金出现。

为了避免这种情况,有些人会添加第二行| grep -v grep来删除该行。

有一个欺骗尽管...

ps aux | grep '[f]irefox'

grep '[f]irefox'与 完全相同的行匹配grep firefox,但现在该grep命令将永远不会匹配自身,因为该单词实际上并没有出现在该命令上。

答案2

ps命令将输出所有当前正在运行的进程。第一个将从该列表中grep删除该进程。grep第二个将提取firefox过滤列表中的任何进程。

这可能是获取firefox进程的进程 ID (PID) 的部分尝试,可能只是为了查看它是否正在运行,或者终止它。

如果是这种情况,我强烈建议您使用pgrep(或者pkill,如果您要终止进程):

if pgrep firefox 2>/dev/null; then
  echo "firefox is already running"
else
  echo "starting firefox..."
  firefox &
done

终止firefox

pkill firefox

那是,首先要绕很远的路找到它的PID。

pgrep另请参阅pkill您的系统的手册。

答案3

分析ps aux | grep -v grep | grep firefox

ps aux会给你进程的输出。第一个 grep( ) 将删除将包含该单词grep -v grep的任何行。之后,将再次对输出进行 grep ( ) 查找该单词并给出输出。ps auxgrepgrep firefoxfirefox

相关内容