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 

...つまり、1列の数値...そしてそれらの数値を「-p」で区切られた1行の数値に変換します...これは次の場合に使用されます...

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 に答える