常に埋め込まれるログファイルがありますが、その名前が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_AMP
PayloadIntegrityCheckFailed
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:
|
sed
tail -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