簡體   English   中英

Shell腳本,用於在搜索特定字符串之后獲取xml中元素的值

[英]shell script to get values of elements in a xml after searching for a particular string

我正在使用以下xml文件

<?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" 

我需要獲取<path>標記中提到的文件。任何人都可以幫助我如何實現它。 我嘗試了一些類似的東西

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

但沒有獲得所需的輸出。

將grep與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>都在一行中,則基於常規語法正則表達式的方法可能是可行的,但是在一般情況下(例如,像您的示例一樣)全部在一行中,這會很困難。

正如Stefan Hegny指出的那樣, grep可能不是處理從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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM