3

我正在寻找一个基于 IP 列表的单行程序,它将附加 IP 所在的国家/地区

所以如果我有这个作为输入:

87.229.123.33
98.12.33.46
192.34.55.123

我想制作这个:

87.229.123.33 - GB
98.12.33.46 - DE
192.34.55.123 - US

我已经有了一个返回 IP 国家/地区的脚本,但我需要用 awk 将它们粘合在一起,到目前为止,这是我想出的:

$ get_ips | nawk '{ print $1; system("ip2country " $1) }'

这很酷,但是ip和国家不在同一行显示,如何将系统输出和ip合并在一行?

如果您有更好的方法来做到这一点,我愿意接受建议。

4

3 回答 3

5

您可以使用printf代替 print:

{ printf("%s - ", $1); system("ip2country " $1); }
于 2009-05-13T11:54:21.760 回答
2

awk 中正确的单行解决方案是:

awk '{printf("%s - ", $1) ; system("ip2country \"" $1 "\"")}' < inputfile

但是,我认为如果您使用如下所示的 python 程序会更快:

#!/usr/bin/python
# 'apt-get install python-geoip' if needed
import GeoIP
gi = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE)
for line in file("ips.txt", "r"):
    line = line[:-1] # strip the last from the line
    print line, "-", gi.country_code_by_addr(line)

如您所见,geoip 对象仅初始化一次,然后被所有查询重用。查看geoip 的 python 绑定。另请注意,您的 awk 解决方案每行 2 次分叉一个新进程!

我不知道您需要处理多少条目,但如果它很多,您应该考虑一些不分叉并将geoip数据库保存在内存中的东西。

于 2009-05-13T13:23:39.460 回答
1

我将使用 perl 单行符来回答,因为我比 awk 更了解该语法。“chomp”将切断困扰你的换行符。

get_ips | perl -ne 'chomp; print; print `ip2country $_`'
于 2009-05-13T10:07:12.917 回答