从数组打印 vs awk 'NR

从数组打印 vs awk 'NR

我目前正在使用以下命令打印出 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

相关内容