我使用下面的代码从文本文件中提取请求 XML,
当请求 XML 标记位于单独的行中时,此方法有效,但当完整的请求位于单行中时,此方法失败。有人可以帮我处理吗?
我的代码片段
echo "Starting Log Extractor on $(date)"
i=0
Request_Tag=GetXyz
Start_Tag="<"$Request_Tag
End_Tag="<\/"$Request_Tag">"
sed -n "/${Start_Tag}/,/${End_Tag}/p" CmServer.log >ExtractedXmls.txt
exec < ExtractedXmls.txt
j=1
while read array[i];
do
filename=GetXyz_$j.xml
a=`echo ${array[$i]} | grep -e "$Start_Tag"`
b=`echo ${array[$i]} | grep -e "$End_Tag"`
LengthStart=$(expr length "$a")
LengthEnd=$(expr length "$b")
if [[ $LengthStart >0 ]]; then
echo ${array[$i]} >> $filename
elif [[ $LengthEnd >0 ]]; then
echo ${array[$i]} >> $filename
((j=j+1))
else
echo ${array[$i]} >> $filename
fi
done
输入文件包含如下文本,
[Thread-4] 08/02/2016 04:39:30:510 DEBUG clyde.q.msgdetail:trace:? - Got msg from queue in QServerImpl
<GetXyz><MsgProtocol>SCIP</MsgProtocol>...........</GetXyz>
[Thread-4] 08/02/2016 04:39:30:510 DEBUG clyde.q.msgdetail:trace:? - Got msg from queue in QServerImpl
<GetXyz>
<MsgProtocol>SCIP</MsgProtocol>
.
.
.
</GetXyz>
答案1
假设:
- 输入文件在不以 开头的行中包含 XML
[Thread
。
解决方案:
- 删除以 开头的行
[Thread
。
这可以做到这一点,并且还删除空行:
sed -e '/^\[Thread/d' -e '^$d' input.txt >output.xml
如果开始标记可能从该[Thread
行的某个位置开始,请删除该行上直到 a 的所有内容<
:
sed -e 's/^\[Thread[^<]*//' -e '^$d' input.txt >output.xml
答案2
使用两种不同的规则来匹配这两种情况:
sed -n '/GetXyz/{ /\/GetXyz/ {p;n} }; /GetXyz/, /\/GetXyz/p'
如果该行与 和 都匹配GetXyz
,则/GetXyz
打印它并继续下一行。如果该行仅匹配GetXyz
,则将其用作打印间隔的开始。