3

我怎样才能得到这个命令的输出......

ps -ef | grep ^apache | grep /sbin/httpd | awk '{print $2}'
16779
16783
16784
16785
16786
16787
16788
16789
16790
16794
16795
16796
16797
16799
16800
16801
16802
16803
16804
16805 

...所以单列数字...并将这些数字转换为由“ -p ”分隔的单行数字...这将用于以下...

lsof -p 16779 -p 16783 -p 16784 ... 
4

6 回答 6

3

管道进入

sed 's/^/-p /' | tr '\n' ' '
于 2012-08-25T11:53:25.127 回答
2

如果你有它,pidof会更方便:

lsof $(pidof apache | sed 's/^\| / -p /g')
于 2012-08-25T14:16:11.220 回答
1
tmp="lsof "
for i in `ps -ef | awk '/^apache/ && /httpd/ {print $2}'`;
do
 tmp=${tmp}" -p "${i}" "; 
done
echo $tmp

应该做的伎俩

于 2012-08-25T11:49:31.367 回答
1

您可以通过管道输入awk

awk 'BEGIN { printf "lsof" } { printf " -p %s", $1 } END { printf "\n" }'

结果:

lsof -p 16779 -p 16783 -p 16784 -p 16785 -p 16786 -p 16787 -p 16788 -p 16789 -p 16790 -p 16794 -p 16795 -p 16796 -p 16797 -p 16799 -p 16800 -p 16801 -p 16802 -p 16803 -p 16804 -p 16805
于 2012-08-25T11:52:31.020 回答
1

在命令替换中,管道中的换行符将转换为空格。

pids=$( ps -ef | awk '/^apache/ && /\/sbin\/httpd/ {print $2}' ) )

然后调用 printf 可用于格式化lsof. 格式字符串根据需要对包含在pids.

lsof $( printf "-p %s " $pids )
于 2012-08-25T13:46:29.280 回答
0

将以下代码添加到您的一个衬里:

awk '{print $0 " -p "}' | tr '\n' '  ' | awk -F " " '{print "lsof -p "  $0}'

最终代码:

ps -ef | grep ^apache | grep /sbin/httpd | awk '{print $2}' | awk '{print $0 " -p "}' | tr '\n' '  ' | awk -F " " '{print "lsof -p "  $0}'
于 2012-08-25T14:56:58.367 回答