我正在寻找基于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?
如果你有更好的方法,我愿意接受建议。
答案 0 :(得分:5)
您可以使用 printf 代替print:
{ printf("%s - ", $1); system("ip2country " $1); }
答案 1 :(得分: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对象仅初始化一次,然后重用于所有查询。查看python binding for geoip。另请注意,您的awk解决方案每行2次激活新进程!
我不知道您需要处理多少条目,但如果它是大部分条目,您应该考虑不分叉的东西并将geoip数据库保留在内存中。
答案 2 :(得分:1)
我会用perl单行回答,因为我知道语法比awk更好。 “chomp”将切断困扰你的换行符。
get_ips | perl -ne 'chomp; print; print `ip2country $_`'