2013-08-06 138 views
5

我收到以下消息時,我做了「PS英法| grep的端口」解析PS和grep輸出

apache 6215  1 0 11:20 ?  00:00:00 perl /scripts/myscript.pl -sn 4123E -sku HSME01-HW -port 8 

有沒有一種方法來解析如下:

  • 啓動時間(11:20)
  • SN(4123E)
  • SKU(HSME01-HW)
  • 端口(8)
+3

「grep」不應該在標題中,但這是沒有理由-1新手,而不是回答他的問題! – saeedgnu

+0

這更多的是「有多少種不同的方式來解析輸出」而不是「有沒有辦法做到這一點」的問題。 –

+0

你可能會發現'ps -eo start_time,args'有點容易解析 –

回答

7

可以使用awk兩個過濾和解析:

ps -ef | awk '/[p]ort/ {printf "start time: %s\nsn: %s\nsku: %s\nport: %s\n", $5, $11, $13, $NF}' 

正如glenn jackman在註釋中指出的那樣,過濾器字符串中的方括號可以防止表達式與過程列表中的過濾器字符串本身相匹配。

+2

既然它也可以從ps輸出中選擇awk命令,可以使用'/ [p] ort /'來過濾 –

+0

@glennjackman好點。固定。 –

+0

謝謝Ansgar。有人能向我解釋$ 5,$ 11,$ 13,$ NF是指什麼? – Jeremy

3

由於這個問題被標記爲bash,只使用bash的解決方案(沒有AWK或Perl)是首選......

LINE='apache 6215  1 0 11:20 ?  00:00:00 perl /scripts/myscript.pl -sn 4123E -sku HSME01-HW -port 8' 

## Convert string to bash array 
ARR=($LINE) 

echo "start time (${ARR[4]})" 
echo "sn (${ARR[10]})" 
echo "sku (${ARR[12]})" 
echo "port (${ARR[14]})" 

## How to save the value? 
START_TIME=${ARR[4]}