【问题标题】:IP address and Country on same line with AWKIP 地址和国家与 AWK 在同一行
【发布时间】:2010-10-25 19:38:21
【问题描述】:

我正在寻找一个基于 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合并在一行?

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

【问题讨论】:

  • 顺便说一下,我对你的 ip2country 脚本很感兴趣。是公开的吗?如果您可以分享它,也许您可​​以为此提出一个问题并自己回答。
  • amarillion, ip2country 是我的别名:/usr/bin/geoiplookup $1 | awk -F', ' '{print $NF}' , 我使用 MaxMinds 免费公共数据库

标签: bash awk


【解决方案1】:

您可以使用 printf 代替 print:

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

【讨论】:

  • 真的应该是 "system(system(" 吗?此解决方案是否以所需格式提供输出,"87.229.123.33 - GB"?
  • 糟糕,我删除了额外的“系统”调用。那是一个错字。
  • 您的解决方案输出类似“87.229.123.33GB”和“192.34.55.123US”的内容。
  • Reef,你是对的,我应该在格式字符串中添加“-”。
【解决方案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 数据库保存在内存中的东西。

【讨论】:

  • 您确定 ip2country 不应该在系统调用中的引号内吗?
  • 对。系统调用中缺少 "。关于 awk 的问题是引用的问题一直在发生,我曾经不得不用 56 个 "、` 和 ' 字符编写一个 80 字符的行。
【解决方案3】:

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

get_ips | perl -ne 'chomp; print; print `ip2country $_`'

【讨论】:

    猜你喜欢
    • 2014-03-23
    • 1970-01-01
    • 2010-12-28
    • 2014-10-21
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多