UNIXの大容量ログファイルから情報を取得する簡単な方法

UNIXの大容量ログファイルから情報を取得する簡単な方法

6GBのアプリケーションログファイルがあります。ログの形式は次のとおりです(省略)。

[...]
timestamp;hostname;sessionid-ABC;type=m
timestamp;hostname;sessionid-ABC;set_to_TRUE
[...]
timestamp;hostname;sessionid-HHH;type=m
timestamp;hostname;sessionid-HHH;set_to_FALSE
[...]
timestamp;hostname;sessionid-ZZZ;type=m
timestamp;hostname;sessionid-ZZZ;set_to_FALSE
[...]
timestamp;hostname;sessionid-WWW;type=s
timestamp;hostname;sessionid-WWW;set_to_TRUE

この2行に加えて、会議がたくさんあります。type=mに関連するすべてのセッションを見つける必要があります。set_to_TRUE

私の最初の試みは、すべてのsessionIDをgrepしてtype=mファイルに書き込むことでした。次に、大きなログファイルを繰り返し、ファイルの各行に対してgrepを実行します(1行につき1つのsessionID)。sessionID;set_to_TRUE

この方法は時間がかかります。誰もがこの問題を解決するためのより良いより速い方法についてのヒントを与えることができますか?

ベストアンサー1

各セッションに対応するtypeand isまたはset_toTRUEある場合は、andスコープをFALSE使用してsed以下を実行できます。

sed '/type=m/,/set_to_/!d;/set_to_TRUE$/!d;s/.*\(sessionid-.*\);.*/\1/' infile

/type=m/,/set_to_/範囲に含まれていないすべての行が削除されます。また、範囲がで終わらない行を削除しますset_to_TRUEsessionid次に、残りの行(存在する場合)から抽出します。
または、

sed -n '/type=/h;/set_to_TRUE$/{
x;s/.*\(sessionid-.*\);type=m$/\1/p
}' infile

同じように印刷する必要があります。
後者は、一致する各行の保持バッファを上書きするように機能しますtype=
。次に、一致する各行でset_to_TRUEバッファを交換し、交換を試みます。つまり、sessionidで終わる行から抽出し、type=m成功すると結果を印刷しますp。それ以外の場合は自動印刷が無効になり、何も起こりません-n
上記は、行に末尾の空白がないと仮定しています。

おすすめ記事