ファイルの特定の部分を検索し、その部分から関連情報のみを抽出するにはどうすればよいですか?

ファイルの特定の部分を検索し、その部分から関連情報のみを抽出するにはどうすればよいですか?

約1000行の情報を含むサーバーレポートであるテキストファイルがあります。私が探している情報の一部についてレポートを取得できるスクリプトを作成しようとしています。

たとえば、

サーバー1の状態の確認

日付 - エラー数


2015年6月25日:14

2015年6月24日: 20日

2015年6月23日: 番号17

2015年6月24日: 33

サーバー2の状態の確認

日付 - エラー数


2015年6月25日:4

2015年6月24日: 13

2015年6月23日: 20日

2015年6月24日: 33

Xによるエラー


サーバー1:

32

サーバー2:

24

これら3つの部分は

  • 「サーバー状態チェック1」、
  • 「サーバの状態確認2」と
  • 「xで発生したエラーです。」

抽出する必要がある各セクションのデータは太字で表示されます。

どうすればいいのか知っている人はいますか?
私はそれを使用できることを知っていますが、フラグと一緒に使用することgrepはできません。grep-A-B-C

答え1

どうですか?sedgotos(衝撃、恐怖)を含むスクリプトです。データをより正確に説明すると、単純化することができます。

sed -n '
:start
  /Server .* Health Check/{
      n
      /Date - Count/n
   :loop1
      / : /{p; n; b loop1
      }
      b start
  }
  /Errors caused by/{
      n
   :loop2
      /Server/n
      /^[0-9]/{p; n; b loop2
      }
      b start
  }
'

スクリプトはタイトルの最初のスタイルを認識し、{}部分を入力します。次の行(n)を読み取るか、日付ヘッダーの場合は別の行を読みます。行が「:」スタイル行(/:/)と一致すると、{}セクションが入力され、行が印刷され(p)、次の行が読み取られ(n)、Loop1ラベルに分岐されます(b)。一致する行がなくなったら、ラベルの先頭に分岐します。

ヘッダーの2番目のスタイルを見ても同じことが起こります。

答え2

GNUツールがある場合は、次のようにできます。

for match in \
    Server\ Health\ Check\ 1
    Server\ Health\ Check\ 2
    Errors\ caused\ by\ X
do  grep -Fxm1 "$match"
    case $match in 
    (S*) sed -nEu '/^[0-9/:]+/!q;p';;
    (*)  sed -u '4q;3d;1d';;
esac;done <file

ここでの仮定は次のとおりです。一部興味のあるセクション間にデータを挿入します。(そうではないからcat:)

GNUツールなし:

grep -nxE 'Server Health Check [12]|Errors caused by X' <file |
sed 's|\([^:]*\):S.*|\1,/\n.*[^0-9/:]/{\1!P?}?|
     s|\([^:]*\):E.*|\1{N;s/.*\\n//p;N;s///p?}?|
     y/?/\n/' | sed -e1!N -f- -eD ./file

答え3

最もよく知られている言語に応じて、Perl、Python、Rubyなどの完全なスクリプト言語を使用してください。そうでなければ、Pythonを学ぶことはおそらく最大の利点をもたらすでしょう。多くのLinuxディストリビューションは、Pythonを使用してパフォーマンスにとって重要ではないシステムツールとタスクを実行しています。

検索し、線を分析し、情報を把握し、柔軟で強力なデータ構造で結果を整理することができれば、この状況と今後発生する多くの同様の状況で作業を節約できます。

関連情報