当我搜索一些不存在的进程时,例如
$ ps aux | grep fnord
wayne 15745 0.0 0.0 13580 928 pts/6 S+ 03:58 0:00 grep fnord
Run Code Online (Sandbox Code Playgroud)
显然我不关心 grep - 这和搜索ps过程一样有意义!
如何防止 grep 出现在结果中?
Way*_*ner 531
原来在keychain 中找到了一个解决方案。
$ ps aux | grep "[f]nord"
Run Code Online (Sandbox Code Playgroud)
通过在字母周围加上括号并在字符串周围加上引号,您可以搜索正则表达式,即“找到字符 'f' 后跟 'nord'”。
但是由于您将括号放在模式 'f' 中,现在后面是 ']',所以grep不会显示在结果列表中。尼托!
Bri*_*Guy 188
我使用的另一个选项(尤其是查看进程是否正在运行)是pgrep
命令。这将搜索匹配的进程,但不会列出搜索的 grep 行。我喜欢它,因为它是一种快速的搜索方式,无需正则表达式或转义任何内容。
pgrep fnord
Run Code Online (Sandbox Code Playgroud)
RSF*_*on7 74
理想的解决方案是 BriGuy 提出的解决方案
pgrep fnord
Run Code Online (Sandbox Code Playgroud)
但是如果你不想这样做,你可以排除所有与grep匹配的行:
ps aux | grep -v grep | grep "fnord"
Run Code Online (Sandbox Code Playgroud)
Bra*_*sel 34
不是最优雅的解决方案,但您可以这样做:
$ ps aux | grep fnord | grep -v grep
Ema*_*erg 21
在 zsh 中,grep fnord =(ps aux).
这个想法是,首先运行ps aux,将结果放在一个文件中,然后grep在该文件上使用。只是,我们没有文件,因为我们使用 zsh 的“进程替换”。
为了说明,尝试
ps aux > ps.txt
grep fnord ps.txt
rm ps.txt
Run Code Online (Sandbox Code Playgroud)
结果应该是一样的。
对其他一些答案的一般性评论。有些太复杂和/或打字很长。这不仅是正确的问题,还应该是可用的。但这并不意味着其中一些解决方案不好;只是,它们必须封装在一个迷你 UI 中才能使用。
? 这个答案是特定于 GNU 的。有关更通用的解决方案,请参阅Wayne 的回答。
如果您只是在寻找fnord进程,则可以使用-C按命令名称选择的选项:
ps -C fnord
Run Code Online (Sandbox Code Playgroud)
这可以根据您的喜好与 BSD 和 POSIX 风格的格式选项混合使用。有关完整列表,请参阅ps 手册页。
如果您需要比精确搜索命令名称更高级的东西,请不要放弃希望!这仍然可以ps在管道的一侧完成。我们所要做的就是告诉从结果中ps排除grep进程:
ps -NC grep | grep 'fnord'
Run Code Online (Sandbox Code Playgroud)
-C grep选择所有 grep 进程,并-N取消选择。这可用于搜索命令参数、命令名称的一部分或更复杂的正则表达式。
ps aux | grep $(echo fnord | sed "s/^\(.\)/[\1]/g")
Run Code Online (Sandbox Code Playgroud)
最简单的与 shell 无关的方法是首先将其存储在变量中:
PS_OUTPUT="$(ps aux)"; echo "$PS_OUTPUT" |grep fnord
Run Code Online (Sandbox Code Playgroud)
从我的 rc 文件中,我有一个不区分大小写的版本,它采用 grep 的选项:
psl() {
local PS_OUTPUT="$(ps auxww)"
echo "${PS_OUTPUT%%$'\n'*}" >&2 # title, in stderr to avoid pipes
echo "${PS_OUTPUT#*$'\n'}" |grep -i "${@:-^}"
}
Run Code Online (Sandbox Code Playgroud)
代码遍历,每行代码一个项目符号:
ps输出(在local变量中,因此其范围仅限于函数)$PS_OUTPUT并删除第一个换行符之后的所有内容(正则表达式等效:)s/\n.*$//msg。这可以防止我们抓取标题ps的所有内容(正则表达式等效:) ,并使用 grep 其内容(不区分大小写)以及传递给此函数的所有选项(在没有模式的情况下,用于匹配每行的开头)s/^.*\n//m-i^标注:@EmanuelBerg 的grep fnord =(ps aux)答案是迄今为止最优雅的,尽管它需要zsh. 我在 rc 文件中简短地包含了它,但 bash 抱怨该语法,即使有一个条件应该阻止它的评估。