2012-01-23 65 views
0

我有一个文件,不断追加下面的XML。我想从变量中得到的是jobStatus中的percentComplete。我怎么得到这个?不知道如何解析XML。我尝试使用XMLStarlet,但失败了。我想在我可以在shell中使用的变量中获得percentComplete。XML解析的一个值

<batchStatus name="" submissionTime="1/23/12 10:00:26 AM" sentBy="mike" 
timeElapsed="43 second(s)" timeRemaining="4 minute(s)" timeElapsedSeconds="43" 
timeRemainingSeconds="294" percentComplete="12" resumePercentComplete="0" 
status="Processing" batchid="FD66DC21-6AA4-47FB-A3F0-7300C7BDAB8A" /batchStatus> 
<jobStatus name="file.mov" submissionTime="1/23/12 10:00:26 AM" sentBy="mike" 
jobType="Compressor" priority="HighPriority" timeElapsed="43 second(s)" 
timeRemaining="4 minute(s)" timeElapsedSeconds="43" timeRemainingSeconds="294" 
percentComplete="12" resumePercentComplete="0" status="Processing: Transcoding" 
jobid="FDF1A488-51B9-4B9A-908B-FD5D95CE7E92" 
batchid="FD66DC21-6AA4-47FB-A3F0-7300C7BDAB8A" /jobStatus> 
+0

@shellter什么叫 “标记” 为xmlstarlet是什么意思?我尝试了xmlstarlet的帮助,无法弄清楚...任何指向该标签的链接都会有所帮助。 – user983223

+0

@ user983223他的意思是在'sml'上有一个标签,用于'xmlstartlet'的添加,您的问题可以让专家以最好的方式帮助您。我为你添加了该标签。 :) –

+0

xmlstarlet不会是最好的,因为它需要一个完整有效的XML文档,这意味着一个根标签包含了一切。一旦开始附加标签,它就不再是有效的XML。 – npostavs

回答

1

你可以尝试这样的事情 -

var=$(awk -v FS="[ =\"]" '/^<jobStatus/,/\/jobStatus>$/{for (i=1;i<=NF;i++) if ($i~/percentComplete/) print $(i+2)}' file | tail -n 1) 
[jaypal:~/Temp] echo $var 
12 
+0

问题在于xml文件始终被附加新数据。所以当我运行你写的东西时,它给了我所有的百分比值,而不仅仅是最后一个值。 – user983223

+0

@ user983223修正了它。尝试新的解决方案 –

1

看到类似的帖子在这里:Parsing XML using unix terminal

如果你不习惯XML/XSLT,你不想学分析它,那么你可以做的非常脏和切出通过搜索来回答。

另一种选择...我会推荐Xerces解析器,但也有其他的选择。检查上面的链接,因为这两种技术都在那里提到。

+0

谢谢。我前一阵子看过那篇文章。那是我从中找到xmlstarlet的地方。我似乎无法弄清楚如何正确使用它。我尝试过 - 帮助,但对我来说有点困惑。 – user983223