Broネットワークログ解析スクリプトを最適化するのに役立ちます。背景は次のとおりです。
私は多数の兄弟ログを持っていますが、私の範囲(複数可変長サブネット)のIPを照会することにのみ興味があります。
したがって、私が探しているIP範囲に一致する正規表現パターンを含むテキストファイルがあります。
/^10\.0\.0\.([8-9]|[1-3][0-9]|4[0-5])$/
(scope.txtには、正規表現パターンの追加IP範囲の最大20行が含まれています。)findInScope.sh:
#!bin/sh
for file in /data/bro_logs/2016-11-26/conn.*.log.gz
do
echo "$file"
touch /tmp/$file
for nets in $(cat scope.txt)
do
echo "$nets"
zcat $file | bro-cut -d | awk '$3 ~ '$nets' || $5 ~ '$nets'' >> /tmp/$file
done
sort /tmp/$file | uniq > ~/$file
rm /tmp/$file
done
追加の背景知識として、生のbro connログは1時間あたり約100MBであるため、現在のスクリプトは1時間分のログデータを解析するのに約10〜20分かかります。 1日の記録には最大3時間かかることがあります。
私は40個の単一のawkステートメントを使用することを検討しましたが、別のIP範囲で同じスクリプトを使用できるように別のscope.txtファイルが必要だったので、そうしないことにしました。
また、複数のconn.logファイル(zcat conn.*.log.gzなど)でzcatを試みましたが、出力ファイルが1 GBを超えて時間ごとのログを残したかったのです。
ベストアンサー1
awkを介してログファイルを一度だけ渡すと、多くの利点が得られます。これは、すべての正規表現を1つにまとめることを意味します。scope.txt
ファイルでこれをしたくない場合は、awkを呼び出す前に実行してください。例えば、
sed <scope.txt 's|^/\^|(|; s|\$/$|)|; $!s/$/|/' | tr -d '\n' >pattern
zcat $file | bro-cut -d |
awk '
BEGIN{ getline pat <"pattern"; pat = "^(" pat ")$" }
$3 ~ pat || $5 ~ pat
' >~/$file
sed は、各正規表現行の周りの合計を閉じるペアに/^
置き換え、行の末尾に 1 を追加し、1 行の結果をすべてファイルに保存します。したがって、ファイルはすべてORで連結されたパターンです。欠落しているコンテンツは、スキーマファイルを変数として読み取るawkスクリプトステートメントに追加されます。$
()
|
pattern
^(...)$
BEGIN
pat
上記は内部for
ループを置き換えますsort|uniq
。