파일에서 IP 주소 그룹 찾기

파일에서 IP 주소 그룹 찾기

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발견된 마지막 두 위치 사이에 ""를 넣고 ,해당되는 경우 다른 모든 위치 사이에 ""를 넣습니다.London, Paris and Germany

데이터가 라는 파일에 있다고 가정하고 input스크립트를 실행 가능하게 만들거나 다음을 사용하십시오.python scriptname 172.25.2.32

답변2

이 경우 Unix 및 Linux 시스템에서 일반적으로 사용 가능한 다양한 범용 프로그래밍 언어 중 하나를 사용하는 것이 가장 쉬울 수 있습니다(기본 설치의 일부로 또는 간단한 패키지 설치를 통해). 다음은 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 스크립트에 포함된 일반적인 전략을 살펴보는 것이 좋습니다.

  1. 나중에 액세스할 수 있도록 IP 주소 매개변수를 변수에 저장
  2. 파일의 각 줄을 읽으십시오
  3. 행이 위치 설명인지 아니면 IP 주소 범위인지 확인합니다.
  4. 위치 설명인 경우 last_location에 저장됩니다.
  5. IP 주소 범위인 경우 IP가 해당 범위 내에 있는지 확인하세요.
  6. 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...

관련 정보