Trouver des groupes d'adresses IP dans un file

J'ai un file avec des groupes d'adresses IP. Le file ressemble à ceci:

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 

Donc, quand je cherche une adresse IP ( ./program.sh 172.25.2.32 ), la sortie devrait être Londres et l'Allemagne.

Vous n'avez pas accepté les autres solutions, peut-être parce que leur sortie ne correspond pas à la request "Londres et l'Allemagne"

Python moderne peut gérer les adresses IP de la boîte:

 #! /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_ssortingng = sys.argv[1] if sys.version_info < (3,): ip_ssortingng = ip_ssortingng.decode('utf-8') ip = ip_address(ip_ssortingng) 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.rssortingp().split('-')]) else: sr, er = map(ip_address, line.rssortingp().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)) 

Ceci imprime les locations trouvés et met " and " entre les deux derniers locations trouvés et " , " entre tous les autres (le cas échéant): par exemple London, Paris and Germany

Les données sont supposées être dans un file appelé input , rendre le script exécutable, ou appeler avec python scriptname 172.25.2.32

Dans ce cas, l'utilisation de l'un des nombreux langages de programmation à usage général généralement disponibles pour le système Unix et Linux (dans le cadre de l'installation par défaut ou via une installation simple) est probablement la plus simple. Voici un exemple de la façon dont vous pourriez terminer la tâche à l'aide de 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 

Ce n'est pas particulièrement bon Ruby, mais il est capable de profiter de la bibliothèque ipaddr pour éviter d'parsingr manuellement les adresses IP. Bien que le traitement manuel ne soit pas un gros problème dans votre exemple de text, ce serait plus difficile lorsque vous avez des plages telles que 172.25.2.0-172.25.3.200.

Votre question est étiquetée bash et text-processing . Si vous cherchez une réponse en utilisant les outils de traitement de text plus largement disponibles tels que sed, awk et grep, alors vous pouvez regarder la stratégie générale contenue dans le script ruby ​​ci-dessus:

  1. Stockez l'argument d'adresse IP dans une variable pour un access facile plus tard
  2. Lire chaque ligne du file
  3. Déterminez si la ligne est une description d'location ou une plage d'adresses IP.
  4. S'il s'agit d'une description de l'location, stockez-le dans last_location
  5. S'il s'agit d'une plage d'adresses IP, déterminez si votre adresse IP se situe dans cette plage
  6. Si l'adresse IP est dans la plage, imprimez la variable last_location.

Ce n'est pas la solution la plus élégante, mais elle est simple à mettre en œuvre dans un certain nombre de langues et serait facile à suivre pour toute personne familière avec la langue.

perl version de la réponse de Steven :

 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...