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

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

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

有多个 MPI 进程,但我只需要其中一个 PID ./a.out。因此我首先使用以下代码来 grep 它:

ps aux | grep -P "Rl.*a\.out" | grep -oP "\d+"|head -n 1

它给出一个 PID,例如 12345。

现在我想使用:

lsof -p12345 

了解PID 12345的文件路径。

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

答案1

这是您需要的命令:

ps aux|grep -P "Rl.*a\.out"|grep -oP "\d+"|head -n 1 | xargs lsof -p

这里的关键是xargs

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

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

答案2

当命令返回多行(或多条记录)时,我建议使用xargs。在这种情况下,命令返回单个 PID 和一个名为命令替换将是一个合适的解决方案。

这允许一个命令的输出被另一个命令使用,方法是将提供输入的命令包装在$(和 中)。过去,使用反引号 (`),但现在不再推荐使用。

lsof -p $(ps aux|grep -P "Rl.*a\.out"|grep -oP "\d+"|head -n 1)

答案3

你的第一个复杂命令是根据名称查找 PID,可以用以下方式替换pgrep,例如

$ pgrep -nf a.out
70512

然后,要获取路径lsof,您可以使用条件打印awk

因此命令可以是:

$ lsof -p $(pgrep -nf a.out) | awk '$4 == "cwd" {print $9}'

以上内容基于以下lsof输出:

$ lsof -p $(pgrep -nf a.out)
COMMAND   PID   USER   FD   TYPE DEVICE  SIZE/OFF      NODE NAME
gsleep  70513 kenorb  cwd    DIR    1,4      1938 121793972 /my/path

相关内容