Unixシェルスクリプトを使用してログからXMLデータを抽出する方法は? [コピー]

Unixシェルスクリプトを使用してログからXMLデータを抽出する方法は? [コピー]

私の質問は、bashスクリプトからノード値を取得するためにXMLを解析することとは関係ありませんか?また、会社のポリシーのために新しいXMLパーサーをインストール/使用することはできません。これにはshell/perl/awk/sedを使用する必要があります。

私の質問を再現してみましょう。

1)テキストデータが多く、その間にいくつかのXMLデータを公開するprocess.logファイルがあります。
2) 何千ものさまざまな XML およびその他のテキストデータがログに公開されます。
3)今後、公開するXMLファイルを選択するだけです。送信XML:
4)また、選択して新しいファイルにコピーする必要があるXMLファイルは、次のようになります。ALERTIDタグの値と一致するもの
5) ALERTID 値はスクリプト入力に与えられます。だから私たちの例ではmGMjhgHgffHhhFdH1u4入力として提供されるため、この警告用に公開されたXMLファイル全体を選択する必要があります。開始タグはfromで終了タグは
5)したがって、異なる環境で再生できるように、特定のALERTIDに基づいて新しいファイルから関連するXMLファイルを選択する必要があります。

ログ形式:

Info Jan 11 17:30:26.12122 The process is not responding to heartbeats
Debug Jan 11 17:30:26.12123  Incoming XML :<xml version "1.0" encoding ="UTF-8"?>
<Alert trigger = "true" >
<Alerttype>orderReject</Alerttype>
<AlertID>ghghfsjUtYuu78T1</AlertID>
<Order>uusingas</Order>
<Quantity>1254</Quanity>
</Alert> (CreateInitEventHandler. C:356)
Debug Jan 11 17:30:26.12199 The process is going down with warnings
Debug Jan 11 17:30:26.148199 Outgoing XML: <xml version "1.0" encoding ="UTF-8"?>
<Alert trigger = "true" >
<Alerttype>orderheld</Alerttype>
<AlertID>mGMjhgHgffHhhFdH1u4</AlertID>
<Order>uwiofhdf</Order>
<Quantity>7651</Quanity>
</Alert>(CreateEventHandler. C:723)
Debug Jan 11 17:30:26.13214 The process has restarted and thread opened
Debug Jan 11 17:30:26.13215 The heartbeat is recieved from alertlistener process

要件は、入力からAlertIDを取得し、プロセスログをスキャンし、一致する発信XMLを別々のファイルに抽出することです。

awkを使用すると、発信するすべてのXMLファイルを抽出できますが、特定のAlertIDに関連するファイルを抽出する方法がわかりません。

たとえば、

awk '/Outgoing/{p=1; s=$0} P & & /<\/Alert>/ {print $0 FS s; s="" ;p=0}p' 1.log>2.log

ベストアンサー1

一つの方法はいいえ特にこれに適していますが、うまくいくべきことは次のとおりです。

  • すべてが1行に表示されるようにLFを削除します。
  • </Alert>しかし、すべてのXMLが1行になるように、その後にLFを置きます。
  • grep必須コードについては
  • ライン出力とクリーニング

これは次のように翻訳できます。

 tr -d "\r\n" < log_file \
 | sed -e 's/\<?xml/\n&/g' -e 's/\<\/Alert>/&\n/g' \
 | grep -F '<AlertID>mGMjhgHgffHhhFdH1u4</AlertID>'

結果をパイプでxmllint --format -見やすく印刷することもできます。

おすすめ記事