Lua表格过滤器IP的翻译为:Lua表格过滤IP的IP。

我已经将hosts文件和防火墙日志读取到表中,并过滤掉了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

因此,脚本已识别出只有两个不同的IP,它只在字符串/表上放置对应的条目(如果还没有的话),这就是我所在的地方:

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
点赞
用户501459
用户501459

为了消除重复的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 -- 这是防止重复
        table.insert(ips[ip], host) -- 这是为了我们后来的串联
    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-18 22:37:56