ログの一部を別のファイルに抽出

ログの一部を別のファイルに抽出

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

関連情報