如何将 grep 的输出传递给“lsof -p”?

use*_*964 2 bash grep command-line-arguments

我想知道当前运行的路径./a.out

有多个 MPI 进程,但我只需要几个 PID 之一./a.out。所以我首先使用下面的代码来 grep 它:

ps aux | grep -P "Rl.*a\.out" | grep -oP "\d+"|head -n 1
Run Code Online (Sandbox Code Playgroud)

它给出一个 PID,例如 12345。

现在我想使用:

lsof -p12345 
Run Code Online (Sandbox Code Playgroud)

知道PID 12345的文件路径。

如何将两步合并到一个命令行中?

jcb*_*rmu 5

这是您需要的命令:

ps aux|grep -P "Rl.*a\.out"|grep -oP "\d+"|head -n 1 | xargs lsof -p
Run Code Online (Sandbox Code Playgroud)

这里的关键是xargs

grep和等命令awk可以接受标准输入(STDIN) 作为参数,或使用管道作为参数。但是,其他命令(例如cpecho和 )lsof忽略标准输入流,而仅依赖于命令后找到的参数。

使用该命令,xargs您可以从标准输入构建和执行命令行。