[英]How to control AWK on which output field separators to change and which not
我使用此命令使用进程的前5个CPU:
ps -eo pcpu,pmem,pid,ppid,cmd | sort -k 1,1nr | head -5
输出:
0.2 0.0 5037 1 /sbin/hpHelper -I0
0.1 0.0 5567 1 cmahostd -p 15 -s OK -l /var/log/hp-snmp-agents/cma.log
0.1 0.0 5839 1 cmanicd
0.0 0.0 10 1 [watchdog/2]
0.0 0.0 10689 1 cmasm2d -p 30 -l /var/log/hp-snmp-agents/cma.log
这些字段是CPU%,MEMORY%,PID,PPID,COMMAND
我希望输出在每行的开头用时间戳记逗号分隔。 但是,最后一个字段(即command
字段)不应用逗号分隔。 我正在使用以下内容:
ps -eo pcpu,pmem,pid,ppid,cmd | sort -k 1,1nr | head -5 | awk -v dt=$(date +'%Y,%m,%d,%H,%M,%S') -v OFS=, '{$1=dt OFS $1; print $0}'
这给了我一个输出:
2016,05,22,00,26,19,0.2,0.0,5037,1,/sbin/hpHelper,-I0
2016,05,22,00,26,19,0.1,0.0,5567,1,cmahostd,-p,15,-s,OK,-l,/var/log/hp-snmp-agents/cma.log
2016,05,22,00,26,19,0.1,0.0,5839,1,cmanicd
2016,05,22,00,26,19,0.0,0.0,10,1,[watchdog/2]
2016,05,22,00,26,19,0.0,0.0,10689,1,cmasm2d,-p,30,-l,/var/log/hp-snmp-agents/cma.log
而我期望的输出是:
2016,05,22,00,26,19,0.2,0.0,5037,1,/sbin/hpHelper -I0
2016,05,22,00,26,19,0.1,0.0,5567,1,cmahostd -p 15 -s OK -l /var/log/hp-snmp-agents/cma.log
2016,05,22,00,26,19,0.1,0.0,5839,1,cmanicd
2016,05,22,00,26,19,0.0,0.0,10,1,[watchdog/2]
2016,05,22,00,26,19,0.0,0.0,10689,1,cmasm2d -p 30 -l /var/log/hp-snmp-agents/cma.log
如何修改脚本以实现此目的?
我要实现这一点的想法是将输出分成两部分,第一部分用,
作为分隔符,最后一部分用隔离空间。
这是完整的代码,
ps -eo pcpu,pmem,pid,ppid,cmd | sort -k 1,1nr | head -5 | awk -v dt=$(date +'%Y,%m,%d,%H,%M,%S') -v OFS=, '{$1=dt OFS $1; a="" ; b = ""; for (i =1; i<=4; ++i) a=a$i","; for (j = 5; j <= NF; j++) b = b " "$j; print a b; }'
仅适用于awk
部分的代码
awk -v dt=$(date +'%Y,%m,%d,%H,%M,%S') -v OFS=, '{$1=dt OFS $1; a="" ; b = ""; for (i =1; i<=4; ++i) a=a$i","; for (j = 5; j <= NF; j++) b = b " "$j; print a b; }'
尝试一下:
ps -eo pcpu,pmem,pid,ppid,cmd | sort -k 1,1nr | head -5 | awk -v dt=$(date +'%Y,%m,%d,%H,%M,%S') '{printf("%s,%s,%s,%s,%s,",dt,$1,$2,$3,$4);$1=$2=$3=$4="";printf("%s\n",substr($0,5))}'
在第五个字段之后, OFS
不用于处理任何数量的字段。
正如@EdMorton所注意到的那样,这将用单个空格char修改命令中的多个空白char。
另一个解决方案将使命令保持不变,并且列的宽度是固定的:
ps -eo pcpu,pmem,pid,ppid,cmd | sort -k 1,1nr | head -5 | awk -v dt=$(date +'%Y,%m,%d,%H,%M,%S') -v OFS="," '{print dt,$1,$2,$3,$4,substr($0,23)}'
用ps
命令替换cat file
:
$ cat file | sort -k 1,1nr |
awk -v dt=$(date +'%Y,%m,%d,%H,%M,%S') -v OFS=, 'NR<6{cmd=$0; sub(/^[[:space:]]*([^[:space:]]+[[:space:]]+){4}/,"",cmd); print dt,$1,$2,$3,$4,cmd}'
2016,05,21,18,37,49,0.2,0.0,5037,1,/sbin/hpHelper -I0
2016,05,21,18,37,49,0.1,0.0,5567,1,cmahostd -p 15 -s OK -l /var/log/hp-snmp-agents/cma.log
2016,05,21,18,37,49,0.1,0.0,5839,1,cmanicd
2016,05,21,18,37,49,0.0,0.0,10,1,[watchdog/2]
2016,05,21,18,37,49,0.0,0.0,10689,1,cmasm2d -p 30 -l /var/log/hp-snmp-agents/cma.log
请注意,您不需要使用head
,awk可以选择前5行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.