1

我已将主机文件和防火墙日志读取到表中并过滤掉了 ipv4/6 和本地
主机重定向,我现在在处理 ipv4/6 条目时有点卡住了,我不是在寻找
更多的代码方法来实现我想要的,这是一个 ipv4 表的例子:

   test={} 
   test[1]="170.83.210.219 www.test.com www.test.net"
   test[2]="170.83.210.219 www.test.co.uk"
   test[3]="170.83.210.219 test.org"
   test[4]="170.83.210.219 www.test.com"
   test[5]="170.83.300.219 170.83.300.812"
   test[6]="170.83.300.219 www.test1.co.uk"
   test[7]="170.83.300.219 test1.org"
   test[8]="170.83.300.219 www.test1.co.uk"

所需的输出将是从新表中迭代的:

   170.83.210.219 www.test.com www.test.net www.test.co.uk test.org  
   170.83.300.219 170.83.300.812 test1.org www.test1.co.uk  

所以脚本已经识别出只有 2 个不同的 Ips,并且它只将
相应的条目放在字符串/表上,如果它不存在的话,这就是
我要做的:

       for i,v in pairs(test) do
        local t2 = {}
        for X in string.gfind (v, "[^ ]+") do
         table.insert (t2, X) --splits the table values to a table
        end
        local mainip = table.concat(t2, "", 1, 1); 
        ------brain dead!
       end
4

1 回答 1

3

为了消除重复的 IP重复的主机,有一个表,其中 IP 地址是键,值是以主机为键的子表。

ips = {}
for _,line in pairs(test) do
    local ip, host = line:match('(%S+)%s+(%S+)')
    if not ips[ip] then ips[ip] = {} end
    ips[ip][host] = true
end

你最终得到一个像这样的表:

ips = {
  ['170.83.210.219'] = {
    ['www.test.com']   = true,
    ['test.org']       = true,
    ['www.test.co.uk'] = true,
  },
  ['170.83.300.219'] = {
    ['test1.org']       = true,
    ['www.test1.co.uk'] = true,
    ['170.83.300.812']  = true,
  },
}

这看起来很奇怪——您可能更喜欢将主机列表作为数组(即 1-N 作为键,将主机作为值而不是键)——但是将主机存储为键是消除重复项的一种非常有效的方法。

它只是意味着不是迭代主机for _,ip in pairs(ips[x]),而是迭代for ip,_ in pairs(ips[x])


如果您希望结果表采用t[ip] = "host [host ...]"您在 OP 中提到的格式,您可以修改例程以将每个主机存储为一个键(用于防止重复)一个数组元素(用于将列表处理为空格分隔的字符串)。然后在通过数据以折叠任何重复项后,再进行一次通过以创建主机字符串:

ips = {}
for i,v in pairs(test) do
    local ip, host = v:match('(%S+)%s+(%S+)')
    if not ips[ip] then ips[ip] = {} end
    if not ips[ip][host] then 
        ips[ip][host] = true -- this is duplicate prevention
        table.insert(ips[ip], host) -- this is for our concatenation later
    end
end

for ip,hosts in pairs(ips) do
    ips[ip] = table.concat(hosts, ' ')
end

结果一个如下所示的表:

ips = {
  ["170.83.210.219"] = "www.test.com www.test.co.uk test.org",
  ["170.83.300.219"] = "170.83.300.812 www.test1.co.uk test1.org",
}

旁注: t={'a','b'}生成与t={} t[1]='a' t[2] = b.

于 2012-06-18T22:37:56.617 回答