xml парсинг одного значения

У меня есть файл, который продолжает добавлять следующий xml. То, что я хочу получить в переменной, - это процент завершения из jobStatus. Как бы я получил это? Не знаю, как разобрать xml. Я пытался использовать XMLStarlet, но потерпел неудачу. Я хочу получить процент завершения в переменной, которую я могу использовать в оболочке.

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

person user983223    schedule 23.01.2012    source источник
comment
@shellter что вы подразумеваете под тегом для xmlstarlet? Я попробовал --help xmlstarlet и не смог понять... любая ссылка на этот тег была бы полезна.   -  person user983223    schedule 23.01.2012
comment
@ user983223 Он имел в виду, что на SO есть тег для xmlstartlet, добавление которого к вашему вопросу позволит экспертам помочь вам наилучшим образом. Я добавил этот тег для вас. :)   -  person jaypal singh    schedule 23.01.2012
comment
xmlstarlet не подходит для этого, потому что ему нужен полностью корректный XML-документ, а это означает, что все охватывает один корневой тег. Как только вы начнете добавлять теги, это перестанет быть действительным XML.   -  person npostavs    schedule 24.01.2012


Ответы (2)


Вы можете попробовать что-то вроде этого -

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
person jaypal singh    schedule 23.01.2012
comment
проблема в том, что файл xml постоянно дополняется новыми данными. Поэтому, когда я запускаю то, что вы написали, это дает мне все процентные значения, а не только последнее. - person user983223; 23.01.2012
comment
@user983223 user983223 Исправлено. Попробуйте новое решение - person jaypal singh; 23.01.2012

См. аналогичный пост здесь: Синтаксический анализ XML с использованием терминала unix

Если вы не привыкли к XML/XSLT и не хотите учиться его парсить, то можете сделать совсем грязное и вырезать ответ с помощью поиска.

Другой вариант... Я бы рекомендовал парсер Xerces, но есть и другие. Проверьте приведенную выше ссылку, потому что там упоминаются оба этих метода.

person PLG    schedule 23.01.2012
comment
Спасибо. Я видел этот пост некоторое время назад. Вот откуда я нашел xmlstarlet. Я не могу понять, как правильно его использовать. Я пробовал --help, но это меня немного сбивает с толку. - person user983223; 23.01.2012