0

ヘッダーとフッターを持つファイルがあり、データが複数回繰り返されています (ヘッダーとフッターを使用)。データを区切りたいのですが、ヘッダーとフッターは必要ありません。私の目的は、パフォーマンス分析を行うためにデータをクランチすることです。その解析部分だけがうまくいきません。

ファイル内のデータ:

   09:31:56 12/13/11 r/w I/O per second KBytes per sec  Svt ms     IOSz KB     
              VVname      Cur  Avg  Max  Cur  Avg  Max Cur Avg   Cur   Avg Qlen
               admin   r    0    0    0    0    0    0 0.0 0.0   0.0   0.0    -
               admin   w   17   17   17   68   68   68 0.2 0.2   4.1   4.1    -
               admin   t   17   17   17   68   68   68 0.2 0.2   4.1   4.1    0
 z0001_app0136_s.254   r    0    0    0    0    0    0 0.0 0.0   0.0   0.0    -
 z0001_app0136_s.254   w    0    0    0    0    0    0 0.0 0.0   0.0   0.0    -
 z0001_app0136_s.254   t    0    0    0    0    0    0 0.0 0.0   0.0   0.0    0
....................
....................

-----------------------------------------------------------------------------------
  Footer            394   r   87   87      4354 4354      2.7 2.7  49.9  49.9    -
  Footer            394   w  126  126       906  906      0.1 0.1   7.2   7.2    -
  Footer            394   t  213  213      5260 5260      1.2 1.2  24.7  24.7    0
   09:32:57 12/13/11 r/w I/O per second KBytes per sec    Svt ms     IOSz KB     
              VVname      Cur  Avg  Max  Cur  Avg  Max  Cur  Avg   Cur   Avg Qlen
               admin   r    0    0    0    0    0    0  0.0  0.0   0.0   0.0    -
               admin   w   32   24   32  130   99  130  0.2  0.2   4.1   4.1    -
               admin   t   32   24   32  130   99  130  0.2  0.2   4.1   4.1    0
 z0001_app0136_s.254   r    0    0    0    0    0    0  0.0  0.0   0.0   0.0    -
 z0001_app0136_s.254   w    0    0    0    0    0    0  0.0  0.0   0.0   0.0    -

そして、ファイル内のデータは何度も繰り返されます。

4

3 に答える 3

0

十分な量のサンプル データが含まれるように、入力をフォーマットする必要があります。また、達成しようとしていることを示すために、予想される出力を追加する必要があります。また、質問の下にあるコメントを読んで返信することも検討してください。

GNU awkとはいえ、この , の行はあなたを助けるかもしれません:

awk '$1 !~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$/ && $1 != "VVname" && $1 != "Footer"' file.txt
于 2012-09-21T12:18:30.297 に答える
0

これは、この問題に対する私の見解です。

#!/bin/bash
#
# file: 12523967.sh
# Needs at least bash version 3.x

: ${DEBUG:=0}
: ${LOGFILE:="./12523967-data.log"}

TOKENS="VVname Flag Cur_IO_s Avg_IO_s Max_IO_s Cur_KB_s Avg_KB_s Max_KB_s Cur_Svt_ms Avg_Svt_ms Cur_IOSz_KB Avg_IOSz_KB Qlen"
DREGEX="^[[:digit:]]{2}:.*$"

while IFS=, read $TOKENS; do
    ## Skip entry if empty, or contains 'Footer' or 'Timestamp' or 'VVname'
    if [[ -z $VVname || $VVname =~ $DREGEX || $VVname =~ VVname || $VVname =~ Footer ]]; then
        continue
    fi
    [[ $DEBUG -eq 1 ]] && printf "%s %s %s %s %s %s\n" \
                "$VVname $Flag" \
                "$Cur_IO_s $Avg_IO_s $Max_IO_s" \
                "$Cur_KB_s $Avg_KB_s $Max_KB_s" \
                "$Cur_Svt_ms $Avg_Svt_ms" \
                "$Cur_IOSz_KB $Avg_IOSz_KB" \
                "$Qlen"

    # [...] Do whatever you have to do with the named entries

done < <(sed -e 's/^ *//g;s/  */,/g;s/^[\.-]*//g;' $LOGFILE)

あなたの例(「...」と「---」の行を含む。ログファイル出力の一部を形成するかどうかはよくわからなかったので)を使用するとDEBUG=1、フィールド名で解析された行が出力されます。

$ DEBUG=1 ./12523967-parse.sh 
    admin r 0 0 0 0 0 0 0.0 0.0 0.0 0.0  -
    admin w 17 17 17 68 68 68 0.2 0.2 4.1 4.1  -
    admin t 17 17 17 68 68 68 0.2 0.2 4.1 4.1  0
    z0001_app0136_s.254 r 0 0 0 0 0 0 0.0 0.0 0.0 0.0  -
    z0001_app0136_s.254 w 0 0 0 0 0 0 0.0 0.0 0.0 0.0  -
    z0001_app0136_s.254 t 0 0 0 0 0 0 0.0 0.0 0.0 0.0  0
    admin r 0 0 0 0 0 0 0.0 0.0 0.0 0.0  -
    admin w 32 24 32 130 99 130 0.2 0.2 4.1 4.1  -
    admin t 32 24 32 130 99 130 0.2 0.2 4.1 4.1  0
    z0001_app0136_s.254 r 0 0 0 0 0 0 0.0 0.0 0.0 0.0  -
    z0001_app0136_s.254 w 0 0 0 0 0 0 0.0 0.0 0.0 0.0  -
于 2012-10-31T21:44:45.570 に答える
0

このようなデータをクリーンアップする一般的な方法は、grep を使用して、必要なデータを選択するか、不要なデータを除外することです。この場合、必要なすべての行に文字 (r、t、または w) があり、両側にスペースがあり、不要な行にはスペースがないように見えます。(編集:フッター行が質問に追加されたのでgrep -v、フッターを除外するコマンドが追加されました。)

データがファイル d にある場合は、次のように言います。

grep ' [rtw] ' d | grep -v Footer

これにより、データ行が選択されますが、ヘッダー、フッター、または空白行は選択されません。データを含む t というファイルを作成するには、次のように言います。

grep ' [rtw] ' d | grep -v Footer > t

実際のデータ (問題に表示されたものに対して) が空白以外のタブまたは空白を使用'[[:space:]][rtw][[:space:]]'している場合は、. の代わりに検索文字列として使用し' [rtw] 'ます。また、-i が使用されていない場合、grep は大文字と小文字を区別します。除外する用語が両方の方法 (大文字の場合もあれば小文字の場合もある) で出現する場合は、-iv代わりに-vgrep オプションを使用します。

grep '[[:space:]][rtw][[:space:]]' d  | grep -iv footer > t
于 2012-09-21T04:01:29.193 に答える