Imprimindo de arrays vs awk 'NR

0

No momento, estou imprimindo valores dos testes de estresse do vmstat usando:

  vmstat -a $INT $CNT | awk 'NR > 1 {print $13,$14,$15}'> vm.log_$D & sleep 5 && stress --vm $cores -t $seconds_to_run 

Acho que pode ser mais fácil imprimi-los em arrays, mas quando o faço, sempre recebo um erro de sintaxe de {missing, mesmo quando não há. Como posso converter isso para imprimir os valores da coluna $ 13, $ 14, $ 15 usando arrays em vez da maneira acima?

A saída de ambos deve ser a mesma, mas sinto que os arrays parecem mais organizados em termos de saída.

saída 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

Eu gostaria que, quando eu executasse, apenas as colunas percentuais fossem impressas, e não as kb read.

EDITAR **********************************

sar -D output-Eu gostaria de um comando adequado para rodar ao lado do stress -hdd mas esta é a saída que o sar-D 1 10 fornece.

    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]: 

Como posso editá-lo para mostrar apenas isso?

$ 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

fonte: link

    
por paul 01.03.2015 / 19:27

1 resposta

4

Isso realmente não tem nada a ver se os dados são armazenados no awk usando uma matriz ou não.

Como mencionado por @muru, você pode reformatar seus dados em colunas usando o comando column

awk 'NR > 1 {print $13,$14,$15}' | column -t

Alternativamente, apenas defina o separador de campos de saída do awk para TAB em vez de espaço diretamente

awk 'NR > 1 {OFS="\t"; print $13,$14,$15}'

Para requisitos de formatação mais complicados, você pode substituir a declaração print por printf , o que permitiria especificar explicitamente as larguras de campo, por exemplo,

awk 'NR > 1 {printf "%4s%8s%8s\n",$13,$14,$15}'

Para sua exigência de iostat , a primeira coisa a observar é que você pode limitar a saída de iostat apenas ao Relatório de utilização da CPU (omitindo o Relatório de utilização de dispositivo) adicionando a opção de linha de comando -c , por exemplo

 iostat -c 1 10

Além disso, se você quiser pular as linhas em branco e de cabeçalho repetidas, pode fazer algo como

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

ou você pode fazer algo mais sofisticado para imprimir somente o primeiro % cabeçalho:

$ 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
    
por steeldriver 01.03.2015 / 19:55