linux中匹配正確的ip地址


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}'

 

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM