我有大约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 file。
WoW chris你为我做了它现在完美无缺:D谢谢你。你是否知道如果标签位于不同的行上(不是在它开始时在同一行上结束),这个命令是否仍然可用?
<address addr="192.168.1.1" addrtype="ipv4" />
<hostnames><hostname name="test@myserver.com" type="PTR" />
</hostnames>
我同意,但我无法理解您对delimator的描述-F“\”“。熟食店\”不在xml文件中。我错过了什么
很抱歉,但我不明白这是什么'\'这个。这是指起始引号“。感谢
感谢克里斯的帮助,以及非常快速和简单的方式。我现在如何接受你的回答?
答案 0 :(得分:0)
更新的回答:是的,只要引号内的部分没有跨行分割,下面的代码就可以了。
一点解释: Awk将其输入分为fiels。 &lt; -F“\”“&gt;告诉awk将输入字符串拆分为双引号。然后将输入字符串中的每个拆分字段分配给变量$ 1 .. $ NF,其中NF代表字段数。如果您对双引号后的第一个字段感兴趣,那么第二个字段为$ 2.
尝试:
$ 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 Chris
答案 1 :(得分:0)
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"
没有被换行符破坏,这应该有效。两者也可以在同一条线上。
答案 2 :(得分:0)
如果您需要经常操作 xml ,可以安装 XML Gawk :
xgawk -lxml 'XMLSTARTELEM == "address" {
print XMLATTR["addr"]
}
XMLSTARTELEM == "hostname" {
print XMLATTR["name"]
}' infile
您需要删除 XML 开头的空行 为了正确处理文件。