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