2013-01-21 15 views
2

有一個文件,你可以在linux下通過命令ps aux得到。如何使用awk命令切割字段?

USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME COMMAND 
root   1 0.0 0.0 2280 732 ?  Ss 08:20 0:00 init [2] 
root  327 0.0 0.1 2916 1456 ?  Ss 08:20 0:00 udevd --daemon 
root  1681 0.0 0.0 2376 800 ?  Ss 08:20 0:00 /sbin/rpcbind -w 
root  2071 0.0 0.1 27920 1708 ?  Sl 08:20 0:00 /usr/sbin/rsyslogd -c5 

我想最後一個字段的內容,如:

COMMAND 
init [2] 
udevd --daemon 
/sbin/rpcbind -w 
/usr/sbin/rsyslogd -c5 

當我使用,$ AWK '{打印$ 11}' 測試,我得到:

COMMAND 
init 
udevd 
/sbin/rpcbind 
/usr/sbin/rsyslogd 

當我使用$ awk'{print $ 12}'測試時,我得到:

[2] 
--daemon 
-w 
-c5 

我能怎麼做?

回答

5
awk '{for(i=1;i<11;i++)$i="";print }' 

,或者你可以這樣做:

awk '{print $11,$12}' 
+0

第一種方法是最好的,因爲你永遠不知道什麼類型的命令是要出現多少空間將在其中。 – mgoffin

1

如果你不使用AWK要求,以下也適用:

ps aux | tr -s ' ' ' ' | cut -d' ' -f11- 

解讀說了一下。由於ps分離它與空間列,

tr -s ' ' ' ' 

代替重複的空格的字符串用一個空格(第二字符串中指定)(如由第一串[第一組'「]中指定)。現在,由於字段是現在單個空格分隔,我們可以使用

cut -d' ' -f11- 

它說,字段由空格(字符後的「-d」)分離,並選擇字段11月底該行(表示爲'-f11-')。

這看起來可能稍微複雜一些,但它確實簡化了解析分離值字符串,一旦你掌握了它。

1

您可以循環在最後一個字段的話,並打印出來:

ps aux | awk '{ for(i=11 ; i <=NF ; i++) { printf("%s ", $i) } ; print "" }' 

如果你想事後處理的命令,你可以把它放在一個變量:

ps aux | awk '{ CMD = "" ; for(i=11 ; i <=NF ; i++) { CMD = CMD " " $i } ; sub(/^ /, "", CMD) ; print CMD }' 
1

對於上面的輸出,這應該工作:

ps aux | cut -c66- 

注意:小心最後的' - '。如果你錯過了,你只會得到第66個字符!

但是,每次工作時,COMMAND列應該從第66個字符位置開始。如果是不同的,請注意COMMAND列的數量和批改命令就像在這個帖子這個

cut -c<column#>-