我正在尝试解析顶部结果的输出以挑选时间戳、使用的 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