要解決Linux下判斷IP的合法性問題,老規矩,先進行問題分解。這個問題可以分解為:
判斷給出的IP是否為4段由"."分隔的數字組合
限制每個數字組合的大小在0-255之間
多說一句:檢測IP的合法性的演算法在網上一搜一大把,一篇文章抄來抄去。但都是甩出一大堆程式碼來沒有很具體的解釋,看上去很方便,但是對參照學習的人一點好處都沒有,囫圇吞棗,抄完了還是啥都不會。
一、Linux bash shell程式設計的時候遇到這種需要檢測格式的問題,首先就要想到正則表示式。下面我先逐步用組合的方式來構造我們需要的正則表示式:
正則表示式匹配固定模式的字串的時候,我們首先安排一個標記字串開頭和結尾的模式;^和$。^代表字串的開頭位置,$代表字串的結尾位置,在它們中間的部分就是用來匹配字串的內容:
0~255這樣一個數字用正則表示式的語言來說就是:0-9的數字最少匹配1次,最多匹配3次。分隔的“.”符號需要使用跳脫字元,因為“.”在正則表示式中代表除“ \n”之外的任何單個字元,按照IP的格式我們構造4段0~255的數字,加上前面的開始結束符號,就是這個樣子:
二、根據正則表示式判斷IP是否“合規”可以使用if條件判斷
也可以使用grep語句加上-E引數
使用grep語句看一下我們構造的正則表示式的效果:
可以看到已經達到我們的要求,下一步要想辦法限制每段數字的範圍在0~255之間。
因為有了上一步初步的過濾,能夠透過“考驗”的合規字串都是
XXX.XXX.XXX.XXX
這種形式。所以這裡我們使用awk語句,將"."看做域分隔符,把這4個數字分隔開之後分別提取進行輸出。前面的正則表示式已經能夠保證每個數字都是非負的,所以不需要判斷≥0的情況:
如果每一段的數字都在0~255之間,就會列印This IP is valid.。
拿幾個字串來試一下效果:
192.168.1.1
192.168.1.1.1
192.168.1.a
192.168.1.278
可以看到能夠實現我們需要的效果。
寫成一行就是:
總結一下:“盡信書不如無書”,各種例項在網上確實可以信手拈來,但是“拿來主義”導致的後果就是學不到東西。所以遇到shell程式設計的問題,先不要慌,跟著我來,老規矩,先問題分解。
要解決Linux下判斷IP的合法性問題,老規矩,先進行問題分解。這個問題可以分解為:
判斷給出的IP是否為4段由"."分隔的數字組合
限制每個數字組合的大小在0-255之間
多說一句:檢測IP的合法性的演算法在網上一搜一大把,一篇文章抄來抄去。但都是甩出一大堆程式碼來沒有很具體的解釋,看上去很方便,但是對參照學習的人一點好處都沒有,囫圇吞棗,抄完了還是啥都不會。
第一步我們先實現“判斷給出的IP是否為4段由"."分隔的數字組合”的目標一、Linux bash shell程式設計的時候遇到這種需要檢測格式的問題,首先就要想到正則表示式。下面我先逐步用組合的方式來構造我們需要的正則表示式:
正則表示式匹配固定模式的字串的時候,我們首先安排一個標記字串開頭和結尾的模式;^和$。^代表字串的開頭位置,$代表字串的結尾位置,在它們中間的部分就是用來匹配字串的內容:
IP_PATTERN=“^$”0~255這樣一個數字用正則表示式的語言來說就是:0-9的數字最少匹配1次,最多匹配3次。分隔的“.”符號需要使用跳脫字元,因為“.”在正則表示式中代表除“ \n”之外的任何單個字元,按照IP的格式我們構造4段0~255的數字,加上前面的開始結束符號,就是這個樣子:
IP_PATTERN=“^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$”二、根據正則表示式判斷IP是否“合規”可以使用if條件判斷
if [ $IP=~ $IP_PATTERN ]也可以使用grep語句加上-E引數
echo $IP | grep -E $IP_PATTERN使用grep語句看一下我們構造的正則表示式的效果:
可以看到已經達到我們的要求,下一步要想辦法限制每段數字的範圍在0~255之間。
第二步,限制數字的範圍在0~255之間因為有了上一步初步的過濾,能夠透過“考驗”的合規字串都是
XXX.XXX.XXX.XXX
這種形式。所以這裡我們使用awk語句,將"."看做域分隔符,把這4個數字分隔開之後分別提取進行輸出。前面的正則表示式已經能夠保證每個數字都是非負的,所以不需要判斷≥0的情況:
echo $FILTERED_IP | awk -F. "$1<=255&&$2<=255&&$3<=255&&$4<=255{print "This IP is valid."}"如果每一段的數字都在0~255之間,就會列印This IP is valid.。
最終效果拿幾個字串來試一下效果:
192.168.1.1
192.168.1.1.1
192.168.1.a
192.168.1.278
可以看到能夠實現我們需要的效果。
寫成一行就是:
echo $IP | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$"|awk -F. "$1<=255&&$2<=255&&$3<=255&&$4<=255{print "This IP is valid."}"總結一下:“盡信書不如無書”,各種例項在網上確實可以信手拈來,但是“拿來主義”導致的後果就是學不到東西。所以遇到shell程式設計的問題,先不要慌,跟著我來,老規矩,先問題分解。