从PS结果中排除grep
Contents
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”*。