如何让awk在同一行打印3个项目然后切换到新行

如何让awk在同一行打印3个项目然后切换到新行

我正在尝试解析顶部结果的输出以挑选时间戳、使用的 Mem 和使用的 Swap:

top - 12:06:52 up  3:36, 37 users,  load average: 0.00, 0.02, 0.00
Tasks: 563 total,   1 running, 562 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.1%sy,  0.0%ni, 99.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  65968400k total,  9594508k used, 56373892k free,   199136k buffers
Swap: 68026360k total,        0k used, 68026360k free,  5864056k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                    
11527 root      15   0 26464 1728 1056 R  1.9  0.0   0:00.01 top                                                        

这就是其中的一个样本。现在我得到了下面的 awk cmd:

awk '$1 ~/top/ {print $5;} $1 ~/Mem/ {print $4;} $1 ~/Swap/  {print $4;}' top-output

但它并不完美,因为它在新行中输出所有内容。像这样:

7:40,
12644016k
0k
7:50,
12411248k
0k 
8:04,
12795392k
0k

我希望它像这样输出:

7:40, 12644016k, 0k
7:50, 12411248k, 0k

我怎么做?谢谢

答案1

一种方法是使用printf

$ awk '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%s ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36, 9594508k 0k

printf提供灵活的格式设置,除非您明确告诉它,否则它不会打印换行符。第一个参数printf是 的格式字符串printf。格式字符串记录在man awk.

另一种保存值并print仅使用一次的方法:

$ awk '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4;} $1 ~/Swap/  {print up,used,$4;}' top-output
3:36, 9594508k 0k

添加额外的逗号

$ awk '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%s, ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36, 9594508k, 0k

$ awk '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4;} $1 ~/Swap/  {print up,used",",$4;}' top-output
3:36, 9594508k, 0k

剥离出k

使用 printf,我们可以指定整数格式并强制转换为数字,从而删除k

$ awk '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%i, ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36, 9594508, 0k

强制转换为数字的另一种方法是向其添加零。因此,可以使用以下used=$4+0代替used=$4

$ awk '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4+0;} $1 ~/Swap/  {print up,used",",$4;}' top-output
3:36, 9594508, 0k

从正常运行时间中删除逗号

正常运行时间在两个数字之间有一个冒号,awk 无法将其转换为数字。这意味着需要其他方法。使逗号从输出中消失的一种方法是向字段分隔符添加逗号:

$ awk -F'[,[:space:]]+' '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%s ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36 9594508k 0k

$ awk -F'[,[:space:]]+' '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4+0;} $1 ~/Swap/  {print up,used,$4;}' top-output
3:36 9594508 0k

相关内容