LINUX.ORG.RU

Парсинг XML и BASH

 ,


0

3

Доброго времени суток! Ситуация следующая: Где-то далеко-далеко существует контроллер, который мониторит состояние определенного оборудования. Через XML доступна нужная информация, где все значения указаны в виде <параметр>значение</параметр>. В моем случае одна из строк: <cond10>stop</cond10>. Всего 2 возможных значения - stop и work. Необходимо сделать парсер этой самой XML-страницы и написать bash скрипт, выдающий при значении stop цифру 0, а при значении work 1. (судя по всему, передавать данные необходимо POST-запросом, чтобы получить в ответ XML со счетчиками).

Плюс ко всему при переходе на страницу с данными (192.168.1.1/protect/status.xml) контроллер запрашивает логин и пароль, то есть надо еще и залогиниться.

Кое-что проясню: Программистов у нас нет, поэтому задачу поручили мне. В последний раз я сталкивался с программированием еще в школе, так что никакие скрипты никогда в жизни не писал и ничего близко к этому не делал, поэтому прошу помощи. Сейчас наверно посыпятся гневные комментарии в стиле «тупой, чего вообще полез в эту сферу?». Я вас прекрасно понимаю, надо сначала читать, изучить основы программирования, я это сделаю, но задача стоит срочная, никого не волнует, что я в этом полный ноль, без посторонней помощи я пропал.

Чтобы вы не думали, что я совсем ничего не пытался, и просто чтобы вы улыбнулись, вот что я вымучил:

#!/bin/bash

host="http://192.168.1.1/protect/status.xml";
login="admin"
password="admin"

xml='curl -X POST "http://192.168.1.1/protect/status.xml"'\

if [[ `echo $xml | grep cond10>stop` ]]
then
result= echo "0"
sleep 3;
elif
[[ `echo $xml | grep cond10>work` ]]
then
result= echo "1"
sleep 3; 
else
result= echo "fail"
fi
.

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

Башем лучше ничего не парсить. XML лучше парсить, например, питоном.

sT331h0rs3 ★★★★★
()

Вот тебе заготовка

#  echo '<cond10>start</cond10>'| grep -Po '(?<=<cond10>).*?(?=</cond10>)' | grep -q start && echo Started || echo Stopped
Started

#  echo '<cond10>stop</cond10>'| grep -Po '(?<=<cond10>).*?(?=</cond10>)' | grep -q start && echo Started || echo Stopped 
Stopped
zolden ★★★★★
()

Еще один. Пиши Спуфингу, вместе будете xml башем парсить.

daniilArch ★★
()
Последнее исправление: daniilArch (всего исправлений: 1)

А почему не заюзать xmlstarlet например?

Funny_sailor
()

Добавь тег «клоуны набигают», как набигут в нужной концентрации- будет лекция о парсинге xml и былинная ссылка на stackoverflow

zolden ★★★★★
()

Советую подучить XPATH - синтаксис для поиска по дереву. Можно вытаскивать содержимое, например, div с определенным id, вложенный в p определенного класса. Или второй параграф, следующий за хедером с определенным содержимым. Более-менее годный мануал есть в MSDN. Ссылку искать лень, сам нагуглишь.

Перебрал под это дело несколько утилит. Более-менее нормально работает только xmllint. Xmlstarlet пробовал, но что-то не пошло. Возможно, потому что парсил HTML, а не XML.

Bagrov ★★★★★
()

Прошу прощения за долгое отсутствие, всем спасибо за помощь, все получилось, немного кривовато и не совсем так, как я хотел, но не так важно, главное, что все работает. Залил в Zabbix, график наглядный получился.

#!/bin/bash

count=`curl -u admin:admin http://192.168.1.1/protect/status.xml | grep -c "cond10>stop<"` 
if [ "$count" != "0" ]
then 
echo "0"
fi

count=`curl -u admin:admin http://192.168.1.1/protect/status.xml | grep -c "cond10>work<"` 
if [ "$count" != "0" ]
then 
echo "1"
fi

Kirill_NSK
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.