与AWK在同一行的IP地址和国家/地区

时间:2009-05-13 09:55:37

标签: bash awk

我正在寻找基于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?

如果你有更好的方法,我愿意接受建议。

3 个答案:

答案 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 $_`'
相关问题