0

私はKornShell(ksh)にかなり慣れていません。ksh で実行する必要があるプロジェクトがあります。質問は:

「bonnie」ベンチマーク ユーティリティを実行し、出力を解析してブロック書き込み、ブロック読み取り、ランダム シークの値を取得する ksh スクリプトを作成してください。また、これらの値を使用して以前のテストの結果と比較する方法も検討してください。このテストでは、標準の GNU ユーティリティ (sed、awk、grep、cut など) に制限してください。

「bonnie」ユーティリティからの出力は次のとおりです。

# bonnie -s 50M -d /tmp        
File '/tmp/Bonnie.2001096837', size: 52428800
Writing with putc()...done
Rewriting...done
Writing intelligently...done
Reading with getc()...done
Reading intelligently...done
Seeker 1.S.e.eker 2.S.e.eker 3...start 'em...done...done...done...
              -------Sequential Output-------- ---Sequential Input-- --Random--
              -Per Char- --Block--- -Rewrite-- -Per Char- --Block--- --Seeks---
Machine    MB K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU K/sec  %CPU /sec  %CPU
         50.0 36112 34.1 138026  1.9 179048  7.0 51361 51.1 312242  4.3 15211.4 10.3 

このスクリプトの書き方についての提案は、本当にありがたいです。

読んでくれてありがとう!

4

2 に答える 2

0

Shellterの助けを借りて答えを得ました!

bonnie++\

| | awk '/Machine/ {f=1;次}f{

   print "#dbg: line_needed=" $0
   printf("blkWrt=%s\t blkRd=%s\t RandSks=%s\n", $4, $8, $12);exit

}'

于 2013-02-26T03:17:19.097 に答える
0

これは、最後の行に常に必要なデータが含まれていると仮定して、実験するための簡単なソリューションです。

 #              -Per Char- --Block--- -Rewrite-- -Per Char- --Block--- --Seeks---
 # Machine    MB K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU K/sec  %CPU /sec  %CPU
 #            50.0 36112 34.1 138026  1.9 179048  7.0 51361 51.1 312242  4.3 15211.4 10.3 
 #                block write, block read and random seeks/s
 bonnie++ \
 | awk '
       {line=$0} 
        END{
          # print "#dbg:last_line=" $line
          split(line, lineArr)
          printf ("blkWrt=%s\tblkRd=%s\tRandSks=%s\n", lineArr[4], lineArr[8], lineArr[12])
        }' # > bonnieOutput
  # ------^^ remove # to write output to file

( \bonnie++ の後の char は行の最後の文字でなければならないことに注意してください。スペースやタブは使用できません!!! (そうしないと爆発します!) ;-) )

awk は、パイプを介して渡された入力のすべての行を読み取ります。awk の END{} ブロックにいるときは、最後に読み取った行を lineArr[] に入れ、データ内のフィールドのインデックス番号を使用して、その行から必要な要素だけを出力します。lineArr[4]は、データの最後の行の 4 番目のフィールドlineArr[12]、 、12 番目などを返します。表示するデータを取得するために使用するインデックス番号を調整する必要がある場合があります。(あなたはそれを理解する必要があります! ;-)

データをファイルに保存するには、シェル リダイレクトを使用してコメントを外します (との#間の文字を削除します。必要な出力が得られるまで文字をそのままにしておきます。その後、ファイルにリダイレクトできます。}'> bonnieOutput#

言うまでもなく、私が使用したラベルprintfblkWrt=主にデバッグ用です。どのデータをキャプチャする必要があるかを確認し、毎回同じ場所に確実に表示されることを確認したら、それらのラベルを削除すると、他のプログラムで処理できるクリーンなデータファイルが得られます。

ほとんどすべての Unix ツールボックス ユーティリティは行指向であることに注意してください。つまり、一度に 1 行のデータを処理することを想定しており、処理されているものを確認するためのトリックがよくあります。END{} ブロックの先頭に追加した #dbg 行に注意してください。デバッグ出力を表示するには、「#」を削除してコメントを解除する必要があります。

できることはたくさんありますが、awk を使用して ksh/unix ツールボックスを学習したい場合は、機能が何であるかを理解するために時間を費やす必要があります。取り組んでいる問題が含まれている章を読んでも、この問題の解決方法がわからない場合は、その章をもう一度読んだ方がよいのではないでしょうか。;-)

編集

awkでは、変数$0には現在の行のすべてのテキストが含まれていることに注意してください(RS変数値で定義されているように、通常は Unix 行末の char, \n)。その他の番号付きの値、つまり$1$2、現在の行の最初または 2 番目の「フィールド」を示します ( $0)。

以下のコメントからの私の新しい理解に基づいて、テキスト「レイテンシ」を含む行から値を抽出したいと考えています。これはさらに簡単に処理できます。基本パターンは

 bonnie++ \
 | awk '
       /Latency/{ 
          # print "#dbg:latency_line=" $0
          printf ("blkWrt=%s\tblkRd=%s\tRandSks=%s\n", $4, $8, $12)
        }' # > bonnieOutput

したがって、このコードは、パイプを介して bonnie++ から awk にすべての出力を読み取り、「Latency」というテキストを含む行を見つけたら、次の printf フォーマット文字列を使用して、4 番目、8 番目、および 12 番目のフィールドで見つかった値を出力することを示しています。データの各要素の現在の行の番号と正しく一致するように、$4 などを変更する必要があります。つまり、5 ドル、9 ドル、13 ドル、または 3 ドル、9 ドル、24 ドルでしょうか。わかった?

/Latency/ は大文字と小文字が区別されることに注意してください。出力に単語が表示される他の場所がある場合は、出力をフィルタリングするために使用される正規表現の「ルール」を修正する必要があります。

学習課題として、また、Unix ユーザーが毎日使用する非常に基本的なツールとして、awk をスキップして、何bonnie++| grep 'Latency'が得られるかを見てください。

IHTH

于 2013-02-25T22:50:14.343 に答える