如何使用awk命令切割字段?

时间:2013-01-21 03:48:18

标签: shell

有一个文件,您可以通过linux中的命令ps aux获取该文件。

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' {print $ 11}'测试,我得到:

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

当我使用时,$ awk' {print $ 12}'测试,我得到:

[2]
--daemon
-w
-c5

我该怎么办?

5 个答案:

答案 0 :(得分:5)

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

或者您可以这样做:

awk '{print $11,$12}'

答案 1 :(得分:1)

如果您不需要使用awk,则以下内容也适用:

ps aux | tr -s ' ' ' ' | cut -d' ' -f11-
解密那一点。由于ps将其列与空格分开,

tr -s ' ' ' '

用一个空格(在第二个字符串中指定)替换重复的空格字符串(由第一个字符串[第一组'']指定)。现在,由于字段现在是单个空格分隔,我们可以使用

cut -d' ' -f11-

表示字段由空格('-d'后面的字符)分隔,并选择字段11到行尾(表示为'-f11 - ')。

初看起来这看起来有点复杂,但是一旦你掌握了它,它确实简化了对分离值字符串的解析。

答案 2 :(得分: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 }'

答案 3 :(得分:1)

对于上面的输出,这应该有效:

ps aux | cut -c66-

注意:注意最后一个&#39; - &#39;。如果你错过了,你将只得到第66个字符!!!

但是为了每次都能使用, COMMAND 列应该从第66个字符位置开始。如果不同,请记下 COMMAND 列的编号并更改剪切命令,如下所示

cut -c<column#>-

答案 4 :(得分:0)

现有答案在awk版本20070501上无效,它打印了前导空格。这很有用。

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