2012-09-13 117 views
2

如何製作在其stdin中查找IPv6地址的shell命令?如何在命令行管道中匹配IPv6地址

一種選擇是使用:

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:]]:?)' 

這RE是基於「Regular expression that matches valid IPv6 addresses」的想法,但這種說法並不準確。我可以使用更加醜陋的正則表達式,但有沒有更好的方法,我不知道的一些命令?

回答

2

因爲我無法找到使用shell腳本命令的簡單方法,我創建了自己的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

你真的需要查找aheads和查找屁股? – Anthony

+0

看起來語法基本上是這樣的:「8組16位數字,使用冒號(:)使用十六進制數字分隔,或使用數字小數點時使用點(。),併發組的值爲0摺疊成一個雙冒號(::)「。我說基本上就是這麼簡單,但顯然它變得非常快。但我注意到的唯一真正的困難是十六進制和十進制的合法混合。 – Anthony

+0

向前/向後是防止匹配8個以上的組,這顯然不是一個良好的ip6地址。我認爲你的總結是正確的。十六進制組最多可以有四個字符。此答案未找到使用小數表示法的地址。 – JanKanis