Bash IP地址和国家/地区与AWK位于同一行

Bash IP地址和国家/地区与AWK位于同一行,bash,awk,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所在国

因此,如果我将此作为输入:

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合并到一行上


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

我将用perl一行程序来回答,因为我比awk更了解这种语法。“chomp”会切断困扰你的新线

get_ips | perl -ne 'chomp; print; print `ip2country $_`'
您可以使用printf而不是print:

{ printf("%s - ", $1); system("ip2country " $1); }

awk中合适的单衬里解决方案为:

awk '{printf("%s - ", $1) ; system("ip2country \"" $1 "\"")}' < inputfile
如您所见,geoip对象只初始化一次,然后对所有查询重用它。见a。还要注意的是,您的awk解决方案每生产线分叉2次新流程


<>我不知道你需要处理多少条目,但是如果它太多了,你应该考虑一些不叉的东西,并将GEOIP数据库保存在内存中。顺便说一下,我对你的IP2国家脚本感兴趣。它是公共的吗?如果你可以分享它,也许你可以开始一个问题,然后自己回答。amarillion,ip2country是我的别名:/usr/bin/geoiplookup$1 | awk-F',“{print$NF}”,我使用MaxMinds免费公共数据库,它真的应该是“system(system)”(?这个解决方案是否以要求的格式提供输出,“87.229.123.33-GB”?哎呀,我删除了额外的'system'调用。这是一个输入错误。您的解决方案输出了类似“87.229.123.33GB”和“192.34.55.123US”的内容。Reef,您是对的,我应该在格式字符串中添加“-”。您确定在sysetm调用中ip2country不应该在引号内吗?对。缺少一个在系统调用中,关于awk的问题是引用的问题一直在发生,我曾经不得不写一行80个字符,其中有56个“,`和'字符。
#!/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)