有一个文件,在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
我该怎么办?
awk '{for(i=1;i<11;i++)$i="";print }'
或者你可以这样做:
awk '{print $11,$12}'
您可以循环最后一个字段的单词并打印它们:
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 }'
如果不需要使用 awk,以下方法也适用:
ps aux | tr -s ' ' ' ' | cut -d' ' -f11-
稍微解读一下。由于
ps
用空格分隔其列,
tr -s ' ' ' '
用单个空格(在第二个字符串中指定)替换重复的空格字符串(由第一个字符串 [第一组 ' '] 指定)。现在,由于字段现在以单个空格分隔,因此我们可以使用
cut -d' ' -f11-
这表示字段由空格(“-d”后面的字符)分隔,并选择字段 11 到行尾(表示为“-f11-”)。
乍一看,这可能看起来有点复杂,但一旦掌握了它,它确实简化了分隔值字符串的解析。
对于上面的输出,这应该有效:
ps aux | cut -c66-
注意:注意最后一个“-”。如果你错过了,你将只能得到第 66 个字符!!!
但是,要使其每次都有效,COMMAND 列应从第 66 个字符位置开始。如果不同,请记下COMMAND列的编号并像这样更改剪切命令
cut -c<column#>-
现有的答案在 awk 版本 20070501 上不起作用,它打印了前导空格。这有效。
awk '{for(i=1;i<11;i++)$i="";$0=$0;$1=$1;print}'
尝试:
ps aux | awk '{$1=""; $2=""; $3=""; $4=""; $5=""; $6=""; $7=""; $8=""; $9=""; $10=""; print}'