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
各セッションに対応するtype
and isまたはset_to
がTRUE
ある場合は、andスコープをFALSE
使用してsed
以下を実行できます。
sed '/type=m/,/set_to_/!d;/set_to_TRUE$/!d;s/.*\(sessionid-.*\);.*/\1/' infile
/type=m/,/set_to_/
範囲に含まれていないすべての行が削除されます。また、範囲がで終わらない行を削除しますset_to_TRUE
。sessionid
次に、残りの行(存在する場合)から抽出します。
または、
sed -n '/type=/h;/set_to_TRUE$/{
x;s/.*\(sessionid-.*\);type=m$/\1/p
}' infile
同じように印刷する必要があります。
後者は、一致する各行の保持バッファを上書きするように機能しますtype=
。次に、一致する各行でset_to_TRUE
バッファを交換し、交換を試みます。つまり、sessionid
で終わる行から抽出し、type=m
成功すると結果を印刷しますp
。それ以外の場合は自動印刷が無効になり、何も起こりません-n
。
上記は、行に末尾の空白がないと仮定しています。