ログファイルから2つの文字列を抽出する

ログファイルから2つの文字列を抽出する

常に埋め込まれるログファイルがありますが、その名前がlogfile.txtであるとします。このログファイルでは、bashコマンドを使用して、同じ行に異なる文字列を含む単一行の部分文字列を継続的にキャプチャしようとします。

以下は、ログファイルの一行の例です。

2023-08-31 09:56:39,925 [G_M80T72|utx:0:ffffac17000b:45253299:64ec7753:79cb0e|chnl:LN1_CRYPTO_IN_MQ_REQ_AMP|id:196010175121000000000002134] WARN  transaction.GeneralTransactionFailureException - GeneralTransactionFailureException Gateway.Transaction[196010175121000000000000067v1], StatusReason[ProcessingFailed/PayloadIntegrityCheckFailed]

行にが含まれるたびにstring1LN1とstring2をキャプチャしたいと思います。CRYPTO_IN_MQ_REQ_AMPPayloadIntegrityCheckFailed

String1の前には常にchnl:'が続き、string2の前には常にパイプが続きます。 2つの文字列は常に下線で区切られています(ただしstring2には下線も含めることができます)、私の場合はstring1 = LN1ですが、次のようになります。 {すべてのアルファベット文字}LN{すべての数字} String2は文字と数字で構成できます

string1とstring2をキャプチャした後、それを他のコマンドのパラメータとして使用します。たとえば、次のようになります。 {another_command} string1 string2

もちろん、新しいエントリだけをキャプチャする必要があり、ログ全体をスキャンしたくなく、新しい行だけをスキャンしたいので、最初tail -fにファイルを実行してからsedマジックと正規表現を使用したいと思います。

進む方法を知っていますか?

ベストアンサー1

$ sed -e '/PayloadIntegrityCheckFailed/!d' -e 's/.*chnl:\([^|]*\).*/\1/' -e 's/_/ /' file
LN1 CRYPTO_IN_MQ_REQ_AMP

上記のコマンドは、sed文字列を含まないすべての行を削除しますPayloadIntegrityCheckFailed。残りの行は、chnl:次の文字|の間の内容に置き換えられます。文字列の最初の下線が空白文字に変わり、結果が出力されます。

2番目のsed式はs/.*chnl:\([^|]*\).*/\1/、おそらく2つのより単純な置換で置き換えることができます。s/.*chnl://そしてこれは厳密には同じではありませんが、部分文字列の後に文字があるサンプルs/|.*//データに同じ効果があります。chnl:|

sedtail -f継続的な作業のために、ファイルの代わりにコマンドを使用して出力を読み取ることができます。この場合、可能であればラインバッファリング操作sed(非標準-uオプション)を使用することもできます。

tail -f /var/log/some.log | sed -u -e ...as before...

これらの文字列を変数として読み込み、他のプロセスで使用したい場合は、ループから上記のパイプの出力を読み取ることができますwhile

tail -f ... | sed ... |
while read -r first_string second_string; do
    some-command "$first_string" "$second_string"
done

おすすめ記事