1)テキストデータが多く、その間にいくつかのXMLデータを公開するprocess.logファイルがあります。
2) 何千ものさまざまな XML およびその他のテキストデータがログに公開されます。
3)今後、公開するXMLファイルを選択するだけです。送信XML:値
4)また、選択して新しいファイルにコピーする必要があるXMLファイルは、次のようになります。ALERTIDタグの値と一致するもの。
5) ALERTID 値はスクリプト入力に与えられます。したがって、私たちの場合は、mGMjhgHgffHhhFdH1u4
入力からこの警告に対して公開されたXMLファイル全体を選択する必要があります。開始タグはfrom<xml version..>
で終了タグは</Alert>
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に関連するファイルを抽出する方法がわかりません。
また、会社のポリシーのために新しいXMLパーサーをインストール/使用することはできません。これにはshell/perl/awk/sedを使用する必要があります。
たとえば、
awk '/Outgoing/{p=1; s=$0} P & & /<\/Alert>/ {print $0 FS s; s="" ;p=0}p' 1.log>2.log
答え1
あなたのIDが次の変数に提供されたとしますALERTID
。
sed -e '/Outgoing XML/!d;:a' -e '$d;N;s/.*\(<xml version.*<\/Alert>\).*/\1/;Ta' -e "/$ALERTID/!d" yourfile.log
説明する:
/Outgoing XML/!d;:a
行まで内容を削除Outgoing XML
し、ループを開始してから$d
ファイルの末尾から未完了レコードを削除するN;s/.*\(<xml version.*<\/Alert>\).*/\1/;Ta
</Alert>
マーカーが見つかるまで行を追加し、必要なブロック"/$ALERTID/!d $ALERTID`
deletes blocks without the
の前後のすべての内容を削除します。
おそらく読む方が良いでしょう:
sed '/Outgoing XML/!d;:a
$d;N
s/.*\(<xml version.*<\/Alert>\).*/\1/;Ta
/'$ALERTID'/!d' yourfile.log
答え2
次の内容でシェルスクリプトgetalert.shを作成します。
awk '
/^Debug .* Outgoing XML/{
sub(/^.* Outgoing XML: /,"")
H=$0
LC=0
next
}
/<\/Alert>/ {
sub(/Alert>.*$/,"Alert>")
if (LC>0) {print}
LC=0
next
}
/<AlertID>'$1'<\/AlertID>/{
print H
print
LC=1
next
}
/<AlertID>.*<\/AlertID>/{
H=""
LC=0
next
}
{ if (LC > 0) {
print
} else {
H = H $0
}
}' $2
次のように実行
getalert.sh mGMjhgHgffHhhFdH1u4 process.log