Contents

从PS结果中排除grep

1. 概述

有时,我们想找到在我们的系统上运行的特定进程。最常见的解决方案是使用ps  和grep 的组合。

在这个简短的教程中,我们将了解如何缩小对正在运行的进程的搜索范围。我们将看到如何解决一个常见问题,即使用的grep语句也出现在它们自己的搜索结果中。

2. 寻找过程

2.1. 列出所有进程

让我们从列出我们机器上运行的进程开始。首先,让我们打开一个新终端并启动一个*vi * 会话:

% vi

现在,使用第二个终端,让我们使用ps命令查看当前进程列表:

% ps

输出是:

  PID TTY           TIME CMD
 2584 ttys000    0:00.07 -zsh
 2589 ttys001    0:00.03 -zsh
 2592 ttys001    0:00.07 vi

根据进程的数量,  ps输出可能太长而无用。我们经常需要缩小搜索范围。

2.2. 寻找一个特定的过程

要查找一个或多个特定进程,我们可以添加grep命令来缩小结果范围。继续我们的示例,要查找在我们的机器上运行的vi实例,让我们运行:

% ps | grep vi

这给了我们:

 3886 ttys000    0:00.00 grep vi
 2592 ttys001    0:00.07 vi

我们命令的输出包括我们 上面的vi会话。但是,它还包括我们用作过滤器的grep进程,这不是很有帮助。 现在让我们看一下从结果中删除grep的几种方法。

3. 排除grep

3.1. 用grep删除grep

ps输出中排除 grep行 的一种方法是使用带有*-v选项的附加grep*来反转搜索:

% ps | grep vi | grep -v grep

这输出:

 2592 ttys001    0:00.07 vi

在这种情况下,-v选项允许我们的 grep vi结果中的所有内容,但包含字符串*“grep”*的行除外。这可行,但它需要一个额外的过程,并且打字时间更长。

3.2. 制作一个排除grep本身的grep表达式

从输出中排除我们的grep语句的另一种方法是在命令中使用正则表达式

% ps | grep "[v]i"

这只会找到我们的vi进程:

 2592 ttys001    0:00.07 vi

这是因为 grep将双引号中的语句解释为正则表达式。方括号被解析为查找字母 ‘v’ 后跟字符串* ‘i’ *的正则表达式逻辑。

但是,在ps的输出中看到 的这个grep的命令行 包含方括号,正则表达式不匹配。换句话说,grep vi包含grep正在寻找的字符串*“vi”,但grep “[v]i”本身不包含字符串“vi”*。