2

有一个文件,你可以ps aux在linux中通过命令获取。

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

我能怎么做?

4

5 回答 5

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

或者你可以这样做:

awk '{print $11,$12}'
于 2013-01-21T03:51:19.293 回答
2

您可以遍历最后一个字段的单词并打印它们:

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 }'
于 2013-01-21T06:38:45.533 回答
1

如果您不需要使用 awk,则以下方法也有效:

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

稍微破译一下。由于ps用空格分隔它的列,

tr -s ' ' ' '

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

cut -d' ' -f11-

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

乍一看,这似乎有点复杂,但一旦你掌握了它,它确实简化了对分隔值字符串的解析。

于 2013-01-21T04:04:22.403 回答
1

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

ps aux | cut -c66-

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

但是,为了每次都能正常工作,COMMAND列应该从第 66 个字符位置开始。如果不同,请记下COMMAND列的编号并像这样更改剪切命令

cut -c<column#>-
于 2015-11-10T23:52:30.700 回答
0

现有答案在 awk 版本 20070501 上不起作用,它打印了前导空格。这行得通。

awk '{for(i=1;i<11;i++)$i="";$0=$0;$1=$1;print}'
于 2018-05-31T18:18:14.797 回答