2012-09-13 2 views
2

Comment créer une commande shell qui trouve des adresses IPv6 dans son stdin?Comment faire correspondre des adresses IPv6 dans un pipeline de ligne de commande

Une option consiste à utiliser:

grep -Po '(?<![[:alnum:]]|[[:alnum:]]:)(?:(?:[a-f0-9]{1,4}:){7}[a-f0-9]{1,4}|(?:[a-f0-9]{1,4}:){1,6}:(?:[a-f0-9]{1,4}:){0,5}[a-f0-9]{1,4})(?![[:alnum:]]:?)' 

Ce RE est basé sur des idées de "Regular expression that matches valid IPv6 addresses", mais ce n'est pas tout à fait exact. Je pourrais utiliser une expression régulière encore plus laide, mais y a-t-il un meilleur moyen, une commande que je ne connais pas?

Répondre

2

Depuis que je ne pouvais pas trouver un moyen facile à l'aide des commandes de script shell, j'ai créé mon propre en Python:

#!/usr/bin/env python 

# print all occurences of well formed IPv6 addresses in stdin to stdout. The IPv6 addresses should not overlap or be adjacent to eachother. 

import sys 
import re 

# lookbehinds/aheads to prevent matching e.g. 2a00:cd8:d47b:bcdf:f180:132b:8c49:a382:bcdf:f180 
regex = re.compile(r''' 
      (?<![a-z0-9])(?<![a-z0-9]:) 
      ([a-f0-9]{0,4}::?)([a-f0-9]{1,4}(::?[a-f0-9]{1,4}){0,6})? 
      (?!:?[a-z0-9])''', 
     re.I | re.X) 

for l in sys.stdin: 
    for match in regex.finditer(l): 
     match = match.group(0) 
     colons = match.count(':') 
     dcolons = match.count('::') 
     if dcolons == 0 and colons == 7: 
      print match 
     elif dcolons == 1 and colons <= 7: 
      print match 
+0

Avez-vous vraiment besoin de chercher-et look-discontinues effectuées behinds? – Anthony

+0

Il semble que la syntaxe est fondamentalement: "8 groupes de nombres de 16 bits, séparés par deux points (:) en utilisant hexadécimal, ou point (.) Si décimale de nombre est utilisé, avec des groupes concurrents avec une valeur de 0 potentiellement s'effondrer à un double deux-points (: :) ". Je dis fondamentalement comme si c'est si facile, mais évidemment, il devient rapidement très rapide. Mais le seul vrai truc que je remarque est le mélange légal d'hex et de décimal. – Anthony

+0

Le lookahead/behind est d'éviter de faire correspondre plus de 8 groupes, ce qui n'est évidemment pas une adresse ip6 bien formée. Votre résumé est correct, je pense. Les groupes hexadécimaux peuvent comporter jusqu'à quatre caractères. Cette réponse ne trouve pas les adresses qui utilisent la notation décimale. – JanKanis

Questions connexes