約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を使用してパフォーマンスにとって重要ではないシステムツールとタスクを実行しています。
検索し、線を分析し、情報を把握し、柔軟で強力なデータ構造で結果を整理することができれば、この状況と今後発生する多くの同様の状況で作業を節約できます。