grep bash 脚本中带有变量参数的确切进程名称

grep bash 脚本中带有变量参数的确切进程名称

我正在编写一个 bash 脚本,我想在其中 grep 进程的名称。该名称是执行脚本时的参数。

通常我可以这样做ps -ef | grep [w]ord以获得正确的流程。当 grep 的参数(此处[w]ord)类似于$1

例子:

ps -ef | grep [f]fmpeg

将显示这样的线条,仅此而已

jan 117977 117966 0 20:07 pts/0 00:00:01 ffmpeg ..

当我希望在脚本中具有相同的行为并将参数设置为 grep 脚本中的参数时:

ps -ef | grep "$1"

并用它调用./script.sh ffmpeg它会向我显示 ffmpeg 进程(正确),还有grepandbash进程:

jan       117977  117966  0 20:07 pts/0    00:00:01 ffmpeg ..
jan       118566  117021  0 20:14 pts/4    00:00:00 bash ./script.sh ffmpeg
jan       118568  118566  0 20:14 pts/4    00:00:00 grep ffmpeg

我对输出的最后两行不感兴趣

答案1

只需运行:

pgrep -fl script.sh

man pgrep

pgrep、pkill、pidwait - 根据名称和其他属性查找、发出信号或等待进程
-f--full
该模式通常仅与进程名称匹配。设置 -f 时,将使用完整命令行。
-l--list-name
列出进程名称以及进程ID。 (仅限 pgrep。)

答案2

在支持它的 shell 中,您可以使用子字符串扩展将括号放在正确的位置:

name=ffmpeg
ps -ef | grep "[${name:0:1}]${name:1}"

grep "[f]fmpeg"将在管道的右侧运行。

(对于大多数特殊字符来说,这应该相对安全,因为它们通常在括号内并不特殊,但不要指望那里除了字母之外还有任何东西。)

虽然pgrep更好,因为它知道自动忽略自己。它只是不打印所有内容ps,但类似这样的东西可能会有所帮助:

name=ffmpeg
ps -f -p $(pgrep "$name" |tr '\n' ',')

答案3

grep 的反向匹配可以工作吗?

grep -v 'grep\|script'

这不会匹配 grep 或脚本。

相关内容