欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

shell模糊匹配與正則詳解

 更新時間:2020年10月20日 14:10:19   作者:小雨淅淅o0  
這篇文章主要介紹了shell模糊匹配與正則詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言:

正則可以實現(xiàn)一些簡單的功能,并用在腳本中,如檢測ip地址是否符合規(guī)范,檢測文件名是否符合規(guī)范等等。

正則表達式

正則表達式主要是用來描述一個句法規(guī)則的模式。其實說的通俗一點,就是利用字符和元字符的組合,對一些符合既定句法的模式進行模糊匹配。它的主要功能是文本查詢和字符串操作。

正則表達式的基本元素包括普通字符和元字符,在Linux shell里面,常用的正則表達式元字符集為:S={*  .  ^  $  []  \  \<\>  \{\}  \{n,\}  \{n,m\} },每一個元字符都有自己在正則表達式中的含義,下面來介紹一下:

“ * ”符號:表示匹配前面一個普通字符0次或多次。注意這里是一個普通字符,即如果是JO*B的話,那么*就匹配字符“O”任意次,而不是匹配“JO”串。

“ . ”符號:表示匹配任意一個字符。字符“ . "就表示一個字符,這個字符可以是任意字符。例如字符串 ...73 就表示前面3個字符為任意字符(包括空格),第4個和第5個字符分別是7和3。

“ ^ ”符號:表示匹配行首。例如:^cloud就表示匹配以cloud字符串開頭的所有行。與上面匹配一個字符不一樣,這里匹配的是后面跟著的整個字符串。

” $ "符號:表示匹配行尾。例如:cloud$ 就表示匹配以cloud字符串結尾的所有行。結合上面的匹配行首,^$表示匹配空行。

“ [] "符號:表示匹配方括號里面的字符集中的一個。例如:數(shù)字0-9中的任意一個數(shù)字都滿足[0-9]這個表達式。值得注意的是,當^放在[]里面的時候,^就不再表示行首,而是表示取反。如:[^7-9]則表示非7-9中的任意一個數(shù)字才滿足這個表達式。

” \ “符號:是轉義字符。如果你寫的正則表達式里面包括元字符,而你又想將它當做普通字符用的話,就要在前面加上轉義符號" \ "了。例如:\$就表示一個普通字符”$"。

“\<\>"符號:表示精確匹配<>內(nèi)的字符,” \ “是用來轉義<>這兩個字符的。例如:\<the\>表示匹配包含”the“的行,由于精確匹配,所以,”them“,”theory“這些單詞所在的行并不會被匹配到。

”\{\}"符號:與" * "類似,表示匹配前面的一個字符任意多次。但是“\{\}”可以指定重復的次數(shù),如\{3\}則表示重復前面的字符3次;\{3,\}表示重復前面的字符至少3次;\{3,5\}表示重復3到5次。例如:JO\{3\}B則表示重復字符O三次,即JOOOB;JO\{3,\}B則表示至少重復O三次,即JOOOB,JOOOOB等都符合;\{3,5\}則匹配JOOOB,JOOOOB,JOOOOOB這幾個字符串。

通配符

初學的時候對于正則表達式和通配符的理解很模糊,兩個都是可以進行模糊匹配的,到底什么時候用才是正則表達式,什么時候用是通配符呢?其實,我們登錄系統(tǒng)之后,系統(tǒng)的bash shell并不支持正則表達式的,也就是說,我們?nèi)绻褂胋ash shell的某些命令時使用正則表達式,shell可能會認不出來,只有當我們使用類似grep,sed,awk等工具的時候才有效。所以,我們在使用bash shell的時候也想達到模糊匹配的目的的話,就要使用通配符了。

通配符是使用正則表達式的一些元字符來的,常用的元字符集:E={?  *  []  {}  ^ }。不過,這個通配符的元字符意義跟正則表達式里面的不太一樣。例如:

“ * "字符不再表示匹配前面一個字符任意多次,而是表示任意位置的任意字符。例如:phi*ip,則可以匹配philip,phillip,philsaip等開始三個是phi和結尾兩位是ip的任意字符。例如ls -l *.awk表示匹配以.awk結尾的所有文件,*表示任意長度任意字符組合。

" ? ”字符才表示任意一個字符。同正則表達式元字符的" . "

" {} “字符不需要轉義。在{}表示的是表達式集合。如:ls -l {[a-h]*.awk,0?.pem}則表示列出所有以a-h字符開頭的.awk文件的和以0開頭,后面接一個任意字符的.pem文件

" ^ "字符也不是表示行首,而是代表取反。

正則表達式和通配的應用環(huán)境上有些不一樣,但是都能夠達到模糊匹配的效果。在后面介紹到的使用grep,sed和awk等工具對于文件的查找以及各種操作中,正則表達式的匹配作用更加明顯。

 范例:

檢測文件名是否符合規(guī)范:

#!/bin/bash

RED='\033[31m'
GREEN='\033[32m'

awk '{printf("%s",$0)}' $1 | egrep "^#[[:digit:]]*-(docs|unittest|pseudocode|msg-[^ ].*)$" > /dev/null 2>&1

if [ $? -ne 0 ];then
 echo -e "message check ${RED}fail${NORMAL}"
 exit 1
fi
 echo -e "message check ${GREEN}success${NORMAL}"
exit 0

當然,也可以使用if,如:

if [[ $1 =~ ^[0-9]+$ ]]; then
  echo "Is Number."
else
  echo "No Number."
fi

檢測ip地址是否符合規(guī)范:

構造測試文件 ip.txt

10.1.1.1
192.168.0.1
192.168.0.101
255.255.255.255
999.0.0.1
1.0.0.500
a.0.0.0
0.b.0.0
1.1.1
2.2
1
0.0.0.0

基本思路就是要每個點之間的元素為整數(shù),最多為3位整數(shù)[0-9]\{1,3\},然后用 . 拼接起來,加上^和$更精確的限制匹配對象

cat ip.txt |grep '^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$'

結果為

10.1.1.1
192.168.0.1
192.168.0.101
255.255.255.255
999.0.0.1
1.0.0.500
0.0.0.0

這里精度不夠,需要嚴格限制整數(shù)為1-255(第一個元素不能為0,后面的可以為0),即0-9 10-99 100-199 200-249 250-255

\([1-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)    注意|和()轉義,另外|分割的元素要用()括住,若帶-E參數(shù)指定為擴展正則的形式則不需用\轉義

然后后面3個元素只要稍改下范圍到0-255,簡單的拼接起來

復制代碼 代碼如下:
cat ip.txt |grep '^\([1-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\.\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\.\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\.\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)$'

結果如下

10.1.1.1
192.168.0.1
192.168.0.101
255.255.255.255

當然更簡潔的寫法,記得.后面的元要()括起來

復制代碼 代碼如下:
cat ip.txt |grep '^\([1-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\(\.\([0-9]\|([1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\)\{3\}$'

到此這篇關于shell模糊匹配與正則詳解的文章就介紹到這了,更多相關shell模糊匹配與正則內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • CCKiller:Linux輕量級CC攻擊防御工具,秒級檢查、自動拉黑和釋放

    CCKiller:Linux輕量級CC攻擊防御工具,秒級檢查、自動拉黑和釋放

    這篇文章主要介紹了CCKiller:Linux輕量級CC攻擊防御工具,秒級檢查、自動拉黑和釋放,需要的朋友可以參考下
    2016-02-02
  • rsync結合find技巧分享

    rsync結合find技巧分享

    這條指會找到/home 及其子目錄下,所有的*.sh文件,并將備分到/backupdir這個目錄
    2013-01-01
  • Shell?AWK編程的基本介紹和使用詳解

    Shell?AWK編程的基本介紹和使用詳解

    AWK可以看成一門獨立的語言,它擁有語言的基本特征,換句話說AWK可以寫出極其繁瑣和復雜的程序,AWK的語法比Shell的語法還難以接收,這篇文章主要介紹了Shell?AWK編程的介紹和基本使用,需要的朋友可以參考下
    2022-06-06
  • Shell腳本實現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫備份

    Shell腳本實現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫備份

    本文主要介紹了Shell腳本實現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫備份,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-02-02
  • shell批量curl接口腳本的簡單實現(xiàn)方法

    shell批量curl接口腳本的簡單實現(xiàn)方法

    這篇文章主要跟大家介紹了關于shell批量curl接口腳本的簡單實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用shell具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-08-08
  • Linux-nohup命令使用方法詳解

    Linux-nohup命令使用方法詳解

    在Linux環(huán)境中,nohup命令用于在用戶退出或注銷后繼續(xù)運行命令,當終端關閉時,所有在該終端中運行的進程會收到SIGHUP信號并被終止,但使用nohup可以避免這種情況,本文介紹了nohup的基本用法,感興趣的朋友一起看看吧
    2024-09-09
  • 關于Linux之grep查找文本時匹配反斜杠\轉義問題

    關于Linux之grep查找文本時匹配反斜杠\轉義問題

    在Linux系統(tǒng)中,當文本中有反斜杠?,?需要使用grep查找出帶有反斜杠的內(nèi)容,接下來通過本文給大家講解Linux之grep查找文本時匹配反斜杠\轉義問題,需要的朋友可以參考下
    2022-10-10
  • 使用Systemctl列出Linux中所有服務的操作步驟

    使用Systemctl列出Linux中所有服務的操作步驟

    在 Linux 系統(tǒng)中,Systemctl 是一個強大的工具,用于管理系統(tǒng)的服務和守護進程,它可以讓用戶輕松地啟動、停止、重啟以及管理各種系統(tǒng)服務,本文將詳細介紹如何使用 Systemctl 來列出 Linux 中的所有服務,需要的朋友可以參考下
    2024-05-05
  • shell隨機定時修改密碼change_passwd.sh

    shell隨機定時修改密碼change_passwd.sh

    這篇文章主要介紹了shell隨機定時修改密碼change_passwd.sh,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • Linux 下使用shell腳本定時維護數(shù)據(jù)庫的案例

    Linux 下使用shell腳本定時維護數(shù)據(jù)庫的案例

    這篇文章主要介紹了Linux 下使用shell腳本定時維護數(shù)據(jù)庫,本文通過案例分析給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03

最新評論