<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nmaprun>
<?xml-stylesheet href="file:///usr/bin/../share/nmap/nmap.xsl" type="text/xsl"?>
<taskprogress task="Service scan" time="1547503455" percent="88.24" remaining="2" etc="1547503456"/>
<host starttime="1547503444" endtime="1547503476"><status state="up" reason="arp-response" reason_ttl="0"/>
<address addr="0.0.0.0" addrtype="ipv4"/>
<address addr="08:00:27:7F:02:62" addrtype="mac" vendor="Oracle"/>
<hostnames>
</hostnames>
<ports><port protocol="tcp"><state state="open" reason="syn-ack"/><service product="prod1" version="3.0.2" ostype="Unix" method="probed" conf="10"><cpe>cpe:/a:vsftpd:vsftpd:3.0.2</cpe></service><script id="banner" output="220 (vsFTPd 3.0.2)"/></port>
<port protocol="tcp"><state state="open" reason="syn-ack" reason_ttl="64"/><service product="secure" version="6.6.1p1 Ubuntu 2ubuntu2" extrainfo="Ubuntu Linux; protocol 2.0" ostype="Linux" method="probed" conf="10"><cpe>cpe:/a:openbsd:openssh:6.6.1p1</cpe><cpe>cpe:/o:linux:linux_kernel</cpe></service><script id="banner" output="SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2"/></port>
<port protocol="tcp"><state state="open" reason="syn-ack" reason_ttl="64"/><service product="hello i am here" hostname=" typhoon" method="probed" conf="10"><cpe>cpe:/a:postfix:postfix</cpe></service><script id="banner" output="220 typhoon ESMTP Postfix (Ubuntu)"/></port>
<port protocol="tcp"><state state="open" reason="syn-ack" reason_ttl="64"/><service product="who am i" version="9.9.5-3" extrainfo="Ubuntu Linux" ostype="Linux" method="probed" conf="10"><cpe>cpe:/a:isc:bind:9.9.5-3</cpe><cpe>cpe:/o:linux:linux_kernel</cpe></service></port>
</ports>
Я хочу найти строку 'state = "open"', а затем распечатать значение тегов продукта и версии, присутствующих в этой строке (если версия отсутствует - просто напечатать одно значение продукта)
Я использовал следующую команду sed:
cat sample.xml | grep 'state="open"' | egrep -o 'product=".*"' | sed -nE 's/^.*product="([^"]*)".*version="([^"]*)".*$/\1, \2/;p' > output.txt
На выходе я получаю:
prod1, 3.0.2
secure, 6.6.1p1 Ubuntu 2ubuntu2
<port protocol="tcp"><state state="open" reason="syn-ack" reason_ttl="64"/><service product="hello i am here" hostname=" typhoon" method="probed" conf="10"><cpe>cpe:/a:postfix:postfix</cpe></service><script id="banner" output="220 typhoon ESMTP Postfix (Ubuntu)"/></port>
who am i, 9.9.5-3
вывод, который я хочу:
prod1, 3.0.2
secure, 6.6.1p1 Ubuntu 2ubuntu2
hello i am here
who am i, 9.9.5-3
Примечание. Если тег версии отсутствует, печатается вся строка. Я действительно ценю, если кто-нибудь может помочь мне в этом. Спасибо!