2012-01-23 64 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