我目前正在使用以下命令打印出 vmstat 压力测试的值:
vmstat -a $INT $CNT | awk 'NR > 1 {print $13,$14,$15}'> vm.log_$D & sleep 5 && stress --vm $cores -t $seconds_to_run
我认为将它们打印到数组中可能会更整洁,但当我这样做时,即使没有,我也总是得到语法错误 { missing。我如何将其转换为使用数组而不是上述方式打印列 $13、$14、$15 的值?
两者的输出应该相同,但我觉得从输出来看数组看起来更整洁。
iostat 输出
avg-cpu: %user %nice %system %iowait %steal %idle
17.74 1.77 31.43 25.05 0.00 24.02
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 51.97 1349.36 32.86 392947 9568
avg-cpu: %user %nice %system %iowait %steal %idle
9.18 78.57 12.24 0.00 0.00 0.00
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 2.04 12.24 0.00 12 0
我希望在运行它时仅打印百分比列,而不是打印 kb 读取列。
编辑**********************************
sar -D 输出 - 我想要一个合适的命令与压力 -hdd 一起运行,但这是 sar -D 1 10 给出的输出。
4296roryhbmc
1944 rootal,
3361 root
Tasks: 326total,
Cpu(s):25.7%us,54.1%sy,
Mem:2041916k
Swap:1046524kt 0 | 0 0 | 0 0 | 268 957
34 17 49 0 0 0| 0 0 | 0 0 | 0 0 | 279 679
49 31 21 0 0 0| 0 0 | 0 0 | 0 0 | 334 1874
4 6 90 0 0 0| 0 0 | 0 0 | 0 0 | 109 131
28 16 55 1 0 0| 0 4096B| 0 0 | 0 0 | 304 575
42 33 26 0 0 0| 20k 428k| 0 0 | 0 0 | 392 1343
4 10 86 0 0 0| 0 0 | 0 0 | 0 0 | 81 124
8 12 57 22 0 0| 0 0 | 0 0 | 0 0 | 113 193
2 9 66 22 0 0| 0 0 | 0 0 | 0 0 | 74 126
4 12 84 0 0 0| 0 0 | 0 0 | 0 0 | 92 140
8 21 54 17 0 0| 0 0 | 0 0 | 0 0 | 129 286
7 11 48 33 0
*******************************
* Choose from the following: *
*******************************
* [1] Stress the CPU. *
* [2] Stress the Memory(RAM). *
* [3] Stress the disk drive. *
* [4] Stress the hard disk drive. *
Press A to quit.
************************
Enter your menu choice [1-4]:
我该如何编辑它才能使其仅显示此内容?
$ sar -d
SunOS unknown 5.10 Generic_118822-23 sun4u 01/22/2006
00:00:01 device %busy avque r+w/s blks/s avwait avserv
. cut ...
14:00:02 dad0 31 0.6 78 16102 1.9 5.3
dad0,c 0 0.0 0 0 0.0 0.0
dad0,h 31 0.6 78 16102 1.9 5.3
dad1 0 0.0 0 1 1.6 1.3
dad1,a 0 0.0 0 1 1.6 1.3
dad1,b 0 0.0 0 0 0.0 0.0
dad1,c 0 0.0 0 0 0.0 0.0
来源:http://www.ibm.com/developerworks/aix/library/au-unix-perfmonsar.html
答案1
这实际上与数据是否使用数组存储在 awk 中无关。
column
正如 @muru 所述,您可以使用命令将数据重新格式化为列
awk 'NR > 1 {print $13,$14,$15}' | column -t
或者,只需设置 awk 自己的输出字段分隔符直接代替TAB空格
awk 'NR > 1 {OFS="\t"; print $13,$14,$15}'
对于更复杂的格式要求,您可以用 替换该print
语句printf
,这将允许您明确指定字段宽度,例如
awk 'NR > 1 {printf "%4s%8s%8s\n",$13,$14,$15}'
根据您的iostat
要求,首先要注意的是,您可以通过添加命令行开关iostat
将输出限制为仅 CPU 利用率报告(省略设备利用率报告) ,例如-c
iostat -c 1 10
除此之外,如果您想跳过重复的空白行和标题行,您可以执行以下操作
iostat -c 1 5 | awk '/^$/ || /^avg-cpu:/ {next}; {print}'
Linux 3.13.0-45-generic (T61p) 15-03-02 _x86_64_ (2 CPU)
11.11 0.04 2.67 0.14 0.00 86.04
2.53 0.00 1.01 0.00 0.00 96.46
4.46 0.00 1.49 0.00 0.00 94.06
2.99 0.00 1.00 0.50 0.00 95.52
3.02 0.00 0.50 0.00 0.00 96.48
或者你可以做一些更花哨的事情来只打印第一的 %
标头:
$ iostat -c 1 5 | awk '/^$/ || (/^avg-cpu:/ && a) {next}; NR>1 {a=1;print}'
avg-cpu: %user %nice %system %iowait %steal %idle
11.11 0.04 2.67 0.14 0.00 86.04
2.02 0.00 0.51 0.00 0.00 97.47
4.04 0.00 0.51 0.00 0.00 95.45
2.50 0.00 1.00 0.00 0.00 96.50
3.02 0.00 1.01 0.00 0.00 95.98