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 つの異なる 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
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])


OPで言及した形式の結果テーブルが必要な場合はt[ip] = "host [host ...]"、各ホストをキー(重複防止用)および配列要素(リストをスペース区切りの文字列に処理するため)として保存するようにルーチンを変更できます。次に、データを 1 回通過して重複を折りたたんだ後、別のパスを使用してホスト文字列を作成します。

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 に答える