IPアドレスグループを含むファイルがあります。ファイルは次のようになります。
London:
1.1.1.0-1.1.1.200
172.25.2.0-172.25.2.100
Germany:
2.2.2.0-2.2.2.100
192.168.1.0-192.168.1.200
172.25.2.0-172.25.2.200
したがって、IPアドレス()を検索すると./program.sh 172.25.2.32
ロンドンとドイツが出力されるはずです。
答え1
他の解決策を受け入れませんでした。これは、その出力が要求された「ロンドンとドイツ」と一致しないためです。
最新のPythonはIPアドレスを直接処理できます。
#! /usr/bin/env python3.4
# coding: utf-8
# also works on 2.7 after installing ipaddress from PyPI
import sys
from ipaddress import ip_address
print
ip_string = sys.argv[1]
if sys.version_info < (3,):
ip_string = ip_string.decode('utf-8')
ip = ip_address(ip_string)
locs = []
for line in open('input'):
try:
loc, rest = line.split(':')
except ValueError:
try:
if sys.version_info < (3,):
sr, er = map(ip_address, [x.decode('utf-8') for x in line.rstrip().split('-')])
else:
sr, er = map(ip_address, line.rstrip().split('-'))
if sr < ip < er:
locs.append(loc)
except ValueError:
print 'error in input line:', repr(line)
break
if len(locs) > 2:
locs = [', '.join(locs[:-1]), locs[-1]]
print(' and '.join(locs))
これは見つかった場所を印刷し、and
見つかった最後の2つの場所の間に「」を入れ、該当する,
場合は他のすべての場所の間に「」を入れます。London, Paris and Germany
データがという名前のファイルにあるとし、input
スクリプトを実行可能にするか、次を使用します。python scriptname 172.25.2.32
答え2
この場合、Unix および Linux システムで一般的に利用可能な多様な汎用プログラミング言語の 1 つを使用するのが最も簡単な場合があります (基本インストールの一部として、または簡単なパッケージインストールを介して)。以下は、Rubyを使用して直面したタスクを実行する方法の例です。
#!/usr/bin/env ruby
require 'ipaddr'
ip = ARGV[0]
ARGV.delete(ip)
last_location = nil
ARGF.each do |line|
if line.include?(':')
last_location = line.chomp.gsub(/:/, "")
next
end
first, last = line.chomp.split("-").map {|i| IPAddr.new(i).to_i }
needle = IPAddr.new(ip).to_i
if (first..last).include?(needle)
puts "Found #{ip} in #{last_location}"
end
end
特別ではないいいねこれはRubyですが、このipaddr
ライブラリを利用してIPアドレスを手動で確認することを避けることができます。サンプルテキストでは手動で行うことは大きな問題ではありませんが、172.25.2.0-172.25.3.200のような範囲を使用することはより困難です。
あなたの質問にタグが付けられbash
ましたtext-processing
。 sed、awk、grepなど、より広く使用されているテキスト処理ツールを使用して答えを探している場合は、上記のRubyスクリプトに含まれている一般的な戦略を調べることをお勧めします。
- 後でアクセスできるように、IPアドレスパラメータを変数に保存する
- ファイルの各行を読む
- 行が場所の説明かIPアドレス範囲であるかを確認してください。
- ロケーション記述の場合はlast_locationに保存されます。
- IPアドレス範囲の場合は、IPがその範囲内にあることを確認してください。
- IPが範囲内にある場合は、last_location変数を印刷します。
最もエレガントなソリューションではありませんが、複数の言語で直接実装可能で、その言語に精通している人なら誰でも簡単に従うことができます。
答え3
perl
バージョンスティーブンの答え:
perl -MSocket -F- -lane '
sub ip_to_n {unpack"N",inet_aton$_[0]}
BEGIN {$i=ip_to_n(shift)}
if (/:$/) {chop;$l=$_} else {
print $l if $i >= ip_to_n($F[0]) && $i <= ip_to_n($F[1])
}' 172.25.2.32 file1 file2...