2016-06-08 36 views
0

我使用下面的XML文件shell腳本來搜索特定字符串

<?xml version="1.0" encoding="UTF-8"?> 
<log> 
    <logentry revision="31"> 
     <date>2016-06-07</date> 
     <paths> 
      <path kind="file" action="M">components/C_MyAccountChangePassword.component</path> 
     </paths> 
     <msg>R002</msg> 
    </logentry> 
    <logentry revision="26"> 
     <date>2016-06-07</date> 
     <paths> 
      <path kind="file" action="M">applications/Admin_Util.app</path> 
     </paths> 
     <msg>R001 added comments</msg> 
    </logentry> 
</log> 

我必須尋找一個字符串像

grep "R001" 

和我後得到的XML元素的值需要獲取<path>標籤中提到的文件。任何人都可以幫助我如何實現它。我曾試過幾件東西,如

grep -A1 "<msg>R001" log.xml | grep "<path>" 

但沒有得到所需的輸出。

+0

是每個XML標籤上一個新行作爲'edit'忽略新線或你有全部在一個行你早些時候粘貼? – Utsav

回答

0

正如指出的Stefan Hegnygrep可能不是應對來自xml標籤中提取數據的最佳方式,但如果你是明確的有關文件作爲OP的格式(如換行分隔的條目)您可以使用以下邏輯: -

grep -B 3 -w "R001" file | awk -F '[<>]' '/path/{print $3}' 

將產生一個輸出applications/Admin_Util.app

的邏輯是讓搜索的模式,並根據需要才提取n線和部署awk做休息。如果你有興趣的值存儲在腳本中的變量,你可以使用tr

#!/bin/bash 
xmlContent=$(grep -B 3 -w "R001" file | awk -F '[<>]' '/path/{print $3}' | tr -d '\n') 
+0

非常感謝您的幫助 –

0

使用grep with xml通常不是一個好主意。我建議你使用適當的工具,如xslt或xmllint(從libxml

你可能會

xmllint --xpath '//logentry[contains(msg,"R001")]/paths/path' your.xml 

,並得到

<path kind="file" action="M">applications/Admin_Util.app</path> 

可以更容易進行後處理,或使用xsltproc的(也libxml/libxslt)使用XSLT樣式表使輸出適合您需要的形狀。

如果你的xml確實是格式化的,並且所有的<logentry>都在一行中,那麼基於正常的基於句法正則表達式的方法可能是可行的,但是在一般情況下,例如,就像你的樣品一樣,所有這一切都在一條線上,結果很難。