如何在单个 grep 命令中同时使用 AND 和 NOT

如何在单个 grep 命令中同时使用 AND 和 NOT

我正在创建一个 shell 脚本,其中我需要过滤除自己的 grep 进程之外的进程。如果我使用:

echo "step1"
psout=`ps -aux | grep 'deluged'| grep '58846'`
echo "step2"
echo $psout       
...

然后停止脚本意味着第2步不显示!和$psout,输出空白。我不知道为什么。

如果我尝试使用 for AND 和 except颜色

$ ps -aux | grep -e 'deluged' -e '58846' -v "color"
grep: color: No such file or directory

如果我尝试使用 Keychain:

ps -aux | grep -e "[d]eluged"."58846"

Blank OUTPUT

简而言之,如何使用 AND 和 except 自己的 grep 进程来查找单个 grep 进程?

答案1

您在评论中说过,您想知道进程是否存在。使用pgrep -f 'deluge'这个。或者pgrep -f 'deluge.*58846'

pgrep 专门设计用于在进程存在时为您提供 pid,并避免使用 grep 和 ps 进行解析的问题。如果进程不存在,那么您将得到空白输出

您还可以使用sudo netstat -tulpangrep 来查看您的端口号是否在开放端口号之中。

答案2

您可以使用ps aux | grep processname | grep -v 'grep'

第一个grep选择包含进程名称的所有行,第二个grep删除grep-line从输出

答案3

问题是这-v不是一个 except 选项,它实际上意味着匹配被反转。因此,你将打印所有行不匹配‘deluged’ 和 ‘58846’。

-v由于不接受参数,因此生成了错误消息,因此该grep命令正在尝试对文件“color”进行操作。

为了达到预期的结果,您应该使用pgrep通过管道传输到 grep 的命令:

pgrep  -a 'deluged' | grep -e '58846'

这将输出一行,其中包括命令中编号为 58846 的大量进程的 PID 和完整命令。

如果您希望变量psout包含 0 或任何其他选定的字符串,则如果命令成功执行:

psout=$((pgrep -a deluged | grep 58846) > /dev/null && echo "0")
echo $psout
0

相关内容