1.假設IP地址是規范的,沒有出錯誤的
sed -n "/[0-9]\{1,3\}.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p" test
這種匹配存在明顯的問題,在正則匹配的過程中,若是出現300,1,255,0;192.168.0. ;192.168,1.1.1這種錯誤的IP地址,任然會被匹配到
2.IP地址規范與否未知的情況下匹配
在這里,逛論壇的時候看見一位老哥踩了一個坑,這里做 一下記錄
sed -n -r "/((([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\.){3}(([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))/p" test
這個正則在匹配前24位 的時候是沒有問題的,然而,在匹配最后8位的時候,會存在一個讓人很無奈的問題。當你匹配192.168.1.300的時候,是可以匹配到的。為什么呢?我的正則里面可是完全沒有大於 255的情況的啊。
原因如下:
在進行前24位匹配的時候使用的是 :
(([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\.
若是數字之后沒有點號,那么是不會匹配成功的,但是,在匹配最后8位的時候,使用的是
(([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))
當它匹配到30的時候,正則匹配就結束了,這就是為什么會匹配到300的原因
為了解決匹配到大於255的問題,可以在上一個sed的結果之后,利用awk對IP的最后8位進行過濾
sed -n -r "/((([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\.){3}/p" test_1 | awk -F "." '{if($4<255) print $0}'