2012-08-25 59 views
3

我怎樣才能充分利用這個命令的輸出換號的一列空格分隔列表...你怎麼能在bash

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 ... 

回答

3

管進入

sed 's/^/-p /' | tr '\n' ' ' 
+1

「{print}」位可以替換爲「1」,因爲這是匹配規則時的默認塊。 – Thor

+0

'sed'位可能是''s/^/- p /'' – Thor

1
tmp="lsof " 
for i in `ps -ef | awk '/^apache/ && /httpd/ {print $2}'`; 
do 
tmp=${tmp}" -p "${i}" "; 
done 
echo $tmp 

應該做的伎倆

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 
1

在命令取代,從管道中的換行符將被轉換爲空格。

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

然後調用printf可以用來格式化lsof的選項。對於pids中包含的每個參數,格式字符串會根據需要重複。

lsof $(printf "-p %s " $pids) 
2

如果您有它可用,pidof會更方便:

lsof $(pidof apache | sed 's/^\|/-p /g') 
+0

您可以相當簡化流水線;看到很多其他答案。通常將'sed'和'awk'組合在同一個管道中幾乎總是可以避免的。 'ps -ef | awk'/^apache/&&/\/sbin \/httpd/{printf(「-p%i」,$ 2}' – tripleee

+0

我正在複製OPs命令行,但我同意其他答案已涵蓋,我會刪除底部的例子。 – Thor

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}'