【Linux】linux正則表達式及通配符


 

  正則表達式就是用於匹配每行輸入的一種模式,模式是指一串字符序列。擁有強大的字符搜索功能。也非常方便的搜索過濾出我們想要的內容。

linux正則表達式分為基本正則表達式(Basic Regexp)和擴展正則表達式(Extended Regexp)

  linux中,grep,sed,awk都支持正則表達式,這次我們使用grep來演示正則表達式的測試。grep默認僅支持基礎正則表達式,如果使用擴展型正則表達式,可以使用grep -E

 

為了便於觀察匹配的值高亮顯示,可以給grep命令設置GREP_COLOR的值來指定顏色。
下面是部分顏色的值編號
  30 black
  31 red
  32 green
  33 yellow
  34 blue
  35 purple
  36 cyan
  37 white

[root@localhost tmp]# vim  ~/.bashrc
添加這行
export GREP_OPTIONS='--color=auto' GREP_COLOR='33'
[root@localhost tmp]# source ~/.bashrc

 

正則單字符的表示方式

 1.1 單字符分為三種

    特定字符(比如 ' a'  '中')

    范圍內字符,用[]表示,它表示單個字符的范圍,轉指一個字符,比如要搜索包含數字0到9的,就可以[0-9],或者找到123中其中某一個數字[123]。

 grep '[0-9]' passwd
 grep '[a-zA-Z]' passwd

  取反字符

grep '[^a-zA-Z]' passwd

    任意字符( . 來表示)表示匹配任意的字符

 grep . passwd

  

  如果把點放在[]里面就代表本身的意義

  

   加上反義字符 \,效果也是一樣,這個反義字符功能就是對點(.本身功能的取反。

   

    這三種也可以組合成為一個復雜的正則表達式

   

邊界字符:頭尾字符

 ^ :  頭字符符號,例如:^www  注意與[^www]的區別,這里是代表頭字符的意思,是一行以www字符為開頭,而不是一個范圍取反。

[root@localhost tmp]# grep ^www passwd www:x:1002:1002::/home/www:/bin/bash

$:尾字符符號,代表以什么字符為結束的行。

[root@localhost tmp]# grep halt$ passwd
halt:x:7:0:halt:/sbin:/sbin/halt

 如果要匹配空行,可以用頭字符和尾字符放一起

[root@localhost tmp]# grep ^$ passwd

顯示行號可以加n

[root@localhost tmp]# grep -n ^$ passwd
49:

 

元字符(代表普通字符或特殊字符)

     \w: (小寫的w)匹配任何字類字符,包括下划線([A-Za-z0-9_])。

     \W:(大寫的w)匹配任何非字類字符([^A-Za-z0-9_]),相當於上面\w的取反。

     \b:代表單詞的分割。

[root@localhost tmp]# grep '\bx\b' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

 

正則表達式字符組合

   匹配一個大寫后面跟着一個小寫字母的這樣字符組合

[root@localhost tmp]# grep '[A-Z][a-z]' /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
unbound:x:998:996:Unbound DNS resolver:/etc/unbound:/sbin/nologin

   同理試下匹配兩位數字。

[root@localhost tmp]# grep '[0-9][0-9]' /etc/passwd
mysql:x:1001:1001::/home/mysql:/bin/bash
www:x:1002:1002::/home/www:/bin/bash
nginx:x:1003:1003::/home/nginx:/bin/bash
rabbitmq:x:989:986:RabbitMQ messaging server:/var/lib/rabbitmq:/bin/bash
songguojun:x:1004:1004::/home/songguojun:/bin/bash
lang:x:1005:1005::/home/lang:/bin/bash

    結果發現匹配到了所有的挨在一起的兩位數,這個也是正則的最大化匹配,所有有時候返回的結果並不是我們想要的。我們可以用到上面用到的分隔符\b。

[root@localhost tmp]# grep '\b[0-9][0-9]\b' /etc/passwd

    正則表達式可以匹配重復的字符,

  *零次或多次匹配前面的字符或子表達式。

      +一次或多次匹配前面的字符或子表達式。

      ?零次或一次匹配前面的字符或子表達式。

 准備字符串

[root@localhost tmp]# echo -ne " auu \n aeeeeeee\n se \n sdddd \n ooaekkaemma \n" 
 auu 
 aeeeeeee
 se 
 sdddd 
 ooaekkaemmae+
kka

 將上面的字符串寫入到文件中:

[root@localhost tmp]# echo -ne " auu \n aeeeeeee\n se \n sdddd \n ooaekkaemmae+ \n kka \n aeaekk" > test.txt
[root@localhost tmp]# cat test.txt
 auu 
 aeeeeeee
 se 
 sdddd 
 ooaekkaemmae+ 
 kka 

下面就分別使用 * , + , ? 這個三個元字符來匹配ae字符串。

示例1-1 

[root@localhost tmp]#  grep 'ae*' test.txt auu 
 aeeeeeee
 ooaekkaemmae+
kka

 示例1-2 

[root@localhost tmp]#  grep 'ae+'  test.txt
 ooaekkaemmae+ 
[root@localhost tmp]#  grep 'ae\+' test.txt     這里+要轉義下
 aeeeeeee
 ooaekkaemmae+ 

 示例1-3 

[root@localhost tmp]#  grep 'ae\?'  test.txt   這里?也要轉義下 auu 
 aeeeeeee
 ooaekkaemmae+ 
 kka

    上面是匹配重復的單個字符,那如果想匹配重復的表達式呢?這里我們需要另一個符號()。

示例1-4 

[root@localhost tmp]#  grep '\(ae\)*'  test.txt   ()需要轉義
 auu 
 aeeeeeee
 se 
 sdddd 
 ooaekkaemmae+ 
 kka 
 aeaekk

    重復特定的次數{n,m} , n代表重復的最小次數,m代表重復的最大的次數,如果m不寫那就是表示重復無限大的次數。

    任意字符串表示:.*

[root@localhost tmp]# grep 'n..n' /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x:992:990::/run/gnome-initial-setup/:/sbin/nologin
nginx:x:1003:1003::/home/nginx:/bin/bash
[root@localhost tmp]# grep 'n.*n' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

 

[root@localhost tmp]# grep '\bn.*n\b' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin     正則的貪婪匹配

 

 就不要讓匹配任意字符,縮小匹配范圍。

[root@localhost tmp]# grep '\bn[a-z]*n\b' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

 

正則表達式邏輯字符組合

     邏輯的表示:

          | : ' /bin\(false\|true\)'    兩種可能性都存在的情況,注意括號和邏輯或 | 符號 要加上反斜線。

 

[root@localhost tmp]# grep 'bin/\(bash\|nologin\)' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
mysql:x:1001:1001::/home/mysql:/bin/bash
www:x:1002:1002::/home/www:/bin/bash

 

下面在看幾個案例

 

匹配4-9位qq號

[root@localhost tmp]# grep '^[0-9]\{4,10\}$'  test.txt
1123258953
32232
1234

匹配15位或者18位可以包含末尾是x的身份證

[root@localhost tmp]# echo 345895847856388 |  grep '^[1-9]\([1-9]\{13\}\|[0-9]\{16\}\)[0-9xX]$'
345895847856388

  匹配密碼(包含數字,26個字母和下划線組成)

[root@localhost tmp]# echo abc_6388 |  grep '^\w\+$'
abc_6388

 

                                                     正則表達式總結圖

 

linux通配符


 

   通配符是指一些特殊符號,可以用來模糊搜索文件,這些字符包括“?”,“*”,“[]”,{}。

[root@localhost etc]# ls *.conf
asound.conf            cgconfig.conf              colord.conf   extlinux.conf  host.conf    krb5.conf      libuser.conf    mke2fs.conf    ntp.conf  
autofs.conf            cgrules.conf               dnsmasq.conf  fprintd.conf   idmapd.conf  ksmtuned.conf  locale.conf  

 

[root@localhost data]# ls -l /usr/lib*/libm.so*
lrwxrwxrwx. 1 root root 21 6月  27 2017 /usr/lib64/libm.so -> ../../lib64/libm.so.6
lrwxrwxrwx. 1 root root 12 6月  27 2017 /usr/lib64/libm.so.6 -> libm-2.17.so
lrwxrwxrwx. 1 root root 19 6月  27 2017 /usr/lib/libm.so -> ../../lib/libm.so.6
lrwxrwxrwx. 1 root root 12 6月  27 2017 /usr/lib/libm.so.6 -> libm-2.17.so

 

[root@spark78-245 kyhome]# ls *.gif;ls *.png
15194410503451858272.gif  15194410506312962733.gif  15194410811930618141.gif  15194572224055871555.gif  15194572228918706981.gif  
15194575455399643251.png15194575459612727704.gif  15198085947116977864.gif  15194575454541195873.gif  15194575458714249740.gif  
15198085946007107442.gif  15222289284897297936.gif
15194577551806668917.png 

[^0-9] !^表示非,取反

[root@spark78-245 kyhome]# touch abc.png
[root@spark78-245 kyhome]# ls [^0-9]*.png
abc.png

 

[root@spark78-245 kyhome]# ls [!0-9]*.png
abc.png

? 任何一個字符

[root@localhost etc]# ls ???
rpc

gdm:
custom.conf  Init  PostLogin  PostSession  PreSession  Xsession

gss:
mech  mech.d

 

符號 作用
* 匹配任何字符串/文本,包括空字符串;*代表任意字符(0個或多個) ls file *
? 匹配任何一個字符(不在括號內時)?代表任意1個字符 ls file 0
[abcd] 匹配abcd中任何一個字符
[a-z] 表示范圍a到z,表示范圍的意思 []匹配中括號中任意一個字符 ls file 0
{..} 表示生成序列. 以逗號分隔,且不能有空格
補充  
[!abcd] 或[^abcd]表示非,表示不匹配括號里面的任何一個字符


免責聲明!

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



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