2016-05-20 3 views
0

Я хотел бы проанализировать приведенный ниже текст xml в сценарии bash.Анализ элементов XML с атрибутами в сценарии bash

<os name="RedHat" os_version="6"> 
<package_manager type="name">rpm</package_manager> 
<multipath_package_check type="command">rpm -qa | grep device-mapper-multipath</multipath_package_check> 
<mpath_service_enable type="command">chkconfig multipathd on</mpath_service_enable> 
<mpath_service_restart type="command">service multipathd restart</mpath_service_restart> 
</os> 

Например, мне нужно иметь такие функции, как ниже, чтобы вернуть текст, если атрибуты элемента соответствуют аргументам.

get_package_manager "RedHat" "6" 

должен возвращать "обороты"

get_multipath_package_check "RedHat" "6" 

должен возвращать "оборотов в минуту -qa | Grep устройство-картографа-многолучевого"

признателен за любую помощь.

+0

Не пытайтесь разобрать XML с помощью таких инструментов, как 'bash' , 'sed' или' awk'. Таким образом, безумие. Используйте что-то XML-aware, например 'xmlstarlet'. –

ответ

0

Некоторые «синтаксические разборки XML» проще сделать с плоским представлением XML, используя программу xml2 (apt-get install xml2).

правило:

$ xml2 < test.xml | grep package_manager= | cut -d= -f2 
rpm 

$ xml2 < test.xml | grep multipath_package_check= | cut -d= -f2 
rpm -qa | grep device-mapper-multipath 

Но это ничего не решает. Для задачи вы не можете легко решить с помощью xml2, вы можете попробовать выразить свой запрос с помощью XPath и использовать любой инструмент XPATH доступный в CLI, как xmllint:

$ xmllint --xpath '/os[@name="RedHat" and @os_version="6"]/package_manager/text()' test.xml 
rpm 

$ xmllint --xpath '/os[@name="RedHat" and @os_version="6"]/multipath_package_check[@type="command"]/text()' test.xml 
rpm -qa | grep device-mapper-multipath 
+0

Удивительно, большое спасибо за ответ. Это именно то, что я искал. – skrish

+0

Любые предложения, если опция xpath отсутствует в xmllint ?. У этой версии есть только последние версии xmllint. – skrish

+0

@skrish http://stackoverflow.com/questions/15461737/how-to-execute-xpath-one-liners-from-shell –