Как разобрать выходной XML-файл? - PullRequest
0 голосов
/ 27 октября 2011

У меня есть результаты сканирования около 50 VLAN, было легко, когда я сканировал целые подсети с помощью одной команды nmap, но когда дело дошло до анализа / фильтрации информации об активах (например, имени хоста, IP-адреса), это стало одной большой проблемой. Прямо сейчас мне нужно открыть каждый XML-файл (используя программное обеспечение XML), найти отдельные теги и извлечь нужное поле.

Можно ли извлечь нужные поля, используя awk / grep и т. Д.?

Вот как выглядит файл xml

<address addr="192.168.1.1" addrtype="ipv4" />
<hostnames><hostname name="test@myserver.com" type="PTR" /></hostnames>

Меня интересуют только address addr и hostname name

Вот файл xml .

WoW, Крис, ты сделал это для меня, теперь это прекрасно работает: D, благодаря тебе. Знаете ли вы, будет ли эта команда работать, если тег находится в отдельных строках (не заканчивается на той же строке, что и начался)

<address addr="192.168.1.1" addrtype="ipv4" />
<hostnames><hostname name="test@myserver.com" type="PTR" />
</hostnames>

Я согласен, но не могу понять ваше описание гастронома -F "\" ". Мастер гастронома \" не находится внутри xml-файла. Я что-то упускаю

Извините, но я не понимаю, для чего это '\'. Означает ли это начало кавычки ". Thankss

Спасибо, Крис, за то, что вы так помогли, и это тоже очень быстро и легко. Как я могу принять ваш ответ сейчас?

Ответы [ 3 ]

0 голосов
/ 27 октября 2011
awk -F '="|"' '{for (i=1;i<=NF;i++){ if($i~" addr$" && i+1<=NF)print $(i+1); if($i~"hostname name")print $(i+1)} }' yourXml

это должно работать, если addr="192.168.1.1" или name="test@myserver.com" не были разбиты переводом строки. оба могут быть в одной строке.

0 голосов
/ 27 октября 2011

Если вам нужно часто манипулировать xml , вы можете установить XML Gawk :

xgawk -lxml 'XMLSTARTELEM == "address" {
  print XMLATTR["addr"]
  }
XMLSTARTELEM == "hostname" {
  print XMLATTR["name"]
  }' infile 

Вам нужно будет удалить пустые строки в начале вашего XML для правильной обработки файла.

0 голосов
/ 27 октября 2011

Обновленный ответ: Да, до тех пор, пока часть внутри кавычек не будет разделена между строками, приведенный ниже код будет работать.

Немного объяснений: Awk разбивает свои входные данные на поля.<-F "\" "> говорит awk разбивать входную строку на двойные кавычки. Каждое разделенное поле во входной строке затем присваивается переменной $ 1 .. $ NF, где NF обозначает количество полей. В вашем случае выинтересует первое после двойной кавычки, то есть второе поле $ 2.

try:

$ cat file

<address addr="192.168.1.1" addrtype="ipv4" />
<hostnames><hostname name="test@myserver.com" type="PTR" /></hostnames>

Команда:

awk -F"\"" '/<address|<hostnames/{print $2}' file

Вывод:

192.168.1.1
test@myserver.com

HTH Крис

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...