2013-08-06 102 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]}