3

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 を 1 行にマージするにはどうすればよいですか?

これを行うためのより良い方法があれば、提案をお待ちしています。

4

3 に答える 3

5

print の代わりにprintfを使用できます。

{ printf("%s - ", $1); system("ip2country " $1); }
于 2009-05-13T11:54:21.760 に答える
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 オブジェクトは 1 回だけ初期化され、その後すべてのクエリで再利用されます。geoipの Python バインディングを参照してください。また、awk ソリューションは新しいプロセスを 1 行あたり 2 回フォークすることに注意してください。

処理する必要があるエントリの数はわかりませんが、それが多い場合は、フォークせずに geoip データベースをメモリに保持するものを検討する必要があります。

于 2009-05-13T13:23:39.460 に答える
1

awkよりもその構文をよく知っているので、perlのワンライナーで答えます。「chomp」は、気になる改行を切り捨てます。

get_ips | perl -ne 'chomp; print; print `ip2country $_`'
于 2009-05-13T10:07:12.917 に答える