繁体   English   中英

如何控制AWK更改哪些输出字段分隔符,哪些不更改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM