ログエントリからXMLを抽出する方法は?

ログエントリからXMLを抽出する方法は?

XMLメッセージをログにダウンストリームシステムに書き込みます。

ログエントリからXMLを抽出しようとしていますが、sed使用方法がわかりません。

以下は一般的なログエントリです。

2018-02-20T10:02:51.395Z|hostname1|user1||Application Name||10062|DEBUG|o.s.i.channel.DirectChannel||postSend (sent=true) on channel 'logger', message: GenericMessage [payload=<?xml version="1.0" encoding="UTF-8" standalone="yes"?><canonMessage xmlns="somenamespace">...the message body...</canonMessage>, headers={quote_format=FpML, id=f572ea65-91dd-a610-7976-5a1e97c16524, quote_message_id=b640bd90-1624-11e8-a904-bd3c0f5af83b_1519120971176, quote_data=Quote Rep, quote_transaction_originator=user1, timestamp=1519120971394}]

XMLからログエントリの先頭と末尾を削除する方法は?

sed上記の行の出力は次のようになります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><canonMessage xmlns="somenamespace">...the message body...</canonMessage>

答え1

grep -o '<?xml.*</canonMessage>' /path/to/logこれで問題が解決します。

-oオプションが教えてgrepくれるただ指定された正規表現に一致するデータを出力します。幸いなことに、あなたはただ話をするためにここに来ました抜粋(一部)XMLではない分析するそれ。

答え2

以下のsedコマンドを使用して上記の出力を取得しました。

sed  "s/.*payload=//g" input.xml | sed "s/,.*//g"

出力

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><canonMessage xmlns="somenamespace">...the message body...</canonMessage>

答え3

もしあなたなら本物代わりにsedを使いたいgrep、検索、置換を実行し、一致するもののみを印刷することができます。

sed -n 's%.*\(<?xml .*</canonMessage>\).*%\1%p' < input

ここでは-n、デフォルトでその行を印刷し、<?xml ...</canonMessage>そのテキストの周りのエスケープ括弧を使用してテキストを検索し、番号付きスロットに「キャプチャ」します。必要なXMLテキストの前後にグリディ.*正規表現キャプチャを追加すると、行全体を保存されたテキストに置き換えて\1結果行を印刷できます。

私は一般的なスラッシュ区切り文字%のため、検索テキストと代替テキストを区別しました。</canonMessage>スラッシュ区切り文字を好む場合は、一致させたい区切り文字をエスケープします。

sed -n 's/.*\(<?xml .*<\/canonMessage>\).*/\1/p' < input

関連情報