Bashでレポートタイプデータを分析する方法は?

Bashでレポートタイプデータを分析する方法は?

Bashから次のデータを読み取る最良の方法は何ですか?たとえば、データが次のようになると、ls -l1行ずつ読み取ることができ、ファイル内のすべての詳細が1行にあります。この場合、次の形式のデータがあります。ここで、各レコードは空行で区切られます。私はこのデータのクエリを書くための基本的なアイデアを探しています。

      Source:                 test
      Destination:            test2
      Status:                 Idle
      Progress:               -
      State:                  Source
      Lag:                    16:45:45
      Mirror Timestamp:       Wed Nov  5 21:00:27 PST 2014
      Base Snapshot:          1573980876tsfr10_vol.550
      Current Transfer Type:  -
      Current Transfer Error: -
      Contents:               -
      Last Transfer Type:     -
      Last Transfer Size:     944856 KB
      Last Transfer Duration: 00:01:42
      Last Transfer From:     -

      Source:                 test12
      Destination:            test123
      Status:                 Idle
      Progress:               -
      State:                  Source
      Lag:                    10:41:00
      Mirror Timestamp:       Thu Nov  6 03:05:12 PST 2014
      Base Snapshot:          1573980876prd11_vol.1678
      Current Transfer Type:  -
      Current Transfer Error: -
      Contents:               -
      Last Transfer Type:     -
      Last Transfer Size:     83982000 KB
      Last Transfer Duration: 03:21:38
      Last Transfer From:     -

      Source:                 abcd
      Destination:            xyz
      Status:                 Idle
      Progress:               -
      State:                  Source
      Lag:                    02:40:52
      Mirror Timestamp:       Thu Nov  6 11:05:20 PST 2014
      Base Snapshot:          (1573980876prd12_vol.912
      Current Transfer Type:  -
      Current Transfer Error: -
      Contents:               -
      Last Transfer Type:     -
      Last Transfer Size:     17520680 KB
      Last Transfer Duration: 01:23:56

基本的に私が考えることができる1つのオプションは、各レコードに15個の値があるため、15を繰り返し、各行を読み取ってから、照会中のデータを見つけることです。たとえば、「ソーステストの転送サイズ」を見つけようとした場合。

ベストアンサー1

おそらくこのperlは役に立ちます。各段落をハッシュとして読み取り、フィールドを名前で直接参照できます。

perl -00 -F':\s+|\n' -anE '
    %data = @F; 
    say "last transfer of test = ", $data{"Last Transfer Size"}
        if $data{Source} eq "test";
' file
last transfer of test = 944856 KB

この-00オプションは、一連の空行に基づいて入力をレコードに分割します。
この-Fオプションは、フィールド区切り文字を改行またはコロンとスペースに設定します。
この-nオプションを使用すると、スクリプトはファイル内のすべてのレコードに対して繰り返されます。
この-aオプションは、レコードをフィールドに分割して @F 配列に保存します。

あなたの質問に示されている先行スペースが実際にあなたのファイルにないと仮定します。

おすすめ記事