配列からの印刷とawk 'NR


0

現在、これを使用してvmstatストレステストの値を出力しています。

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

それらを配列で印刷する方が賢明かもしれませんが、印刷すると、ない場合でも常に{の構文エラーが表示されます。上記の方法ではなく配列を使用して、これを変換して列$ 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 readカラムではなく、割合カラムのみを印刷するために実行したいのですが。

編集************************************

sar -D output-Iは、stress -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


2
何の配列?Bash配列?awk配列?
ムル

awk配列での出力
ポール

1
そして、それはどのように改善されますか?
ムル

「配列は出力の観点からよりきれいに見える」という意味の例を説明/提供してください-あなたが何をしようとしているのかは明確ではありません。
スチールドライバー

1
まったくありません。スクリプトに情報を保存するために使用する内部データ構造は、データの印刷方法には影響しません。理論的にはこのために配列を使用できますが、スクリプトを書くのが難しくなり、扱いにくく、長くてugくなり、何のメリットもありません。
テルドン

回答:


4

これは、データが配列を使用してawk内に保存されているかどうかに関係ありません。

@muruで述べたように、次のcolumnコマンドを使用してデータを列に再フォーマットできます。

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

私は今それらを試してみますが、どうすれば自分のレコードのために配列に変換できますか?
ポール

vmstatで実行してからcat.filenameを追加すると、フィルタリングされたデータが出力されます。しかし、iostatまたはsarで実行して同じcat.filenameを実行すると、何も出力されません。このフィルターで問題なく印刷されるiostat-typeコマンドとcpu-typeコマンドはありますか?
ポール

iostat出力にはいくつのフィールドがあり、どのフィールドを抽出しようとしていますか?あなたは(フィールドのインデックスを変更しました$13$14など)を適切?
スチールドライバー

iostatには1反復あたり約2行ありますが、約6行ありますが、調整しました。したがって、テキストに書き込むと、書式設定が乱雑になります。$ 1、$ 2などを印刷するのではなく、列名を印刷する方法、たとえばnice%を印刷してすべての追加情報をスキップする方法はありますか?
ポール

任意のコマンド出力を選択された形式に変える単一の「魔法の式」はありません-さまざまなツール(sed、awk、perl、column、...)とその構文解析/パターンマッチング機能に精通する必要があります。特定の要件に関するヘルプが必要な場合は、入力と希望する出力の例を投稿する必要があります。つまり、何を何に変えたいのかを正確に投稿する必要があります。
スチールドライバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.