IP-адрес и страна в одной строке с AWK - PullRequest
3 голосов
/ 13 мая 2009

Я ищу однострочник, который на основе списка 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 ]

5 голосов
/ 13 мая 2009

Вы можете использовать printf вместо печати:

{ printf("%s - ", $1); system("ip2country " $1); }
2 голосов
/ 13 мая 2009

Правильное однострочное решение в 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-привязку для geoip . Также имейте в виду, что Ваше решение awk запускает новый процесс 2 раза в строке!

Я не знаю, сколько записей вам нужно обработать, но если большая их часть, вы должны рассмотреть что-то, что не работает и хранит базу данных geoip в памяти.

1 голос
/ 13 мая 2009

Я отвечу однострочником perl, потому что знаю этот синтаксис лучше, чем awk. "Chomp" отключит новую строку, которая вас беспокоит.

get_ips | perl -ne 'chomp; print; print `ip2country $_`'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...