sedを使用してテキストファイルから任意のXMLを抽出します。

sedを使用してテキストファイルから任意のXMLを抽出します。

複数の要求XMLフラグメントを含むログファイルがあります。この sed コマンドを使用して、要求 XML を抽出して印刷します。

sed -n '/<GetCompensableProductIdentification*/,/<\/GetCompensableProductIdentification>/p' ProductIdentifierService.log

必要なリクエストをフィルタリングできるように、リクエストの開始タグと終了タグに変数を使用したいと思います。どうすればいいですか?

答え1

これはあなたに役立ちます。

 sed -n 's,.*<GetCompensableProductIdentification>\(.*\)</GetCompensableProductIdentification>.*,\1,p' input

xmlstarletしかし、この状況では有効なツールだと思います。

 xmlstarlet sel -t -v '//GetCompensableProductIdentification' -n

答え2

このスクリプト

sed -n '/<GetCompensableProductIdentification>/,/<\/GetCompensableProductIdentification>/p' ProductIdentifierService.log

これをしなければならない

ここのオプションは-n 通常の出力を抑制します。したがって、選択した内容だけが印刷されます。


変数を使用するには、次のものを使用できます。[シェルパラメータの置換]

start_tag="<GetCompensableProductIdentification>"
end_tag="${start_tag/#</<\\/}"
sed -n "/${start_tag}/,/${end_tag}/p" ProductIdentifierService.log

これはあなたがスクリプトを書くように誘惑するでしょう

# Script name - xmlparser.sh
#!/usr/bin/env bash
start_tag="$1"
end_tag="${start_tag/#</<\\/}"
if [ -e "$2" ] # Extra check if file exists
then
   sed -n "/${start_tag}/,/${end_tag}/p" "$2"
else
   echo " The file : $2 doesn't exists"
fi

次のようにスクリプトを実行します。

./xmlparser.sh "<GetCompensableProductIdentification>"  "/path/to/log/file"

関連情報