10.1 通配符
通配符是由shell處理的, 它只會出現在 命令的“參數”里。當shell在“參數”中遇到了通配符
時,shell會將其當作路徑或文件名去在磁盤上搜尋可能的匹配:若符合要求的匹配存在,則進
行代換(路徑擴展);否則就將該通配符作為一個普通字符傳遞給“命令”,然后再由命令進行處
理。總之,通配符 實際上就是一種shell實現的路徑擴展功能。在 通配符被處理后, shell會先
完成該命令的重組,然后再繼續處理重組后的命令,直至執行該命令。
10.1.1 SHELL中的通配符
10.1.2 通配符實例
1、顯示所有menu0開頭的文件
[root@kittod ~]# ls menu0*
menu01.sh menu02.sh menu03.sh menu04.sh
2、顯示所有m開頭后面只有單個字符的文件
[root@kittod ~]# ls m?
m1 m2 m3
3、顯示所有m或者n開頭的文件
[root@kittod ~]# ls [mn]*
m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh n71 n72 n73
4、顯示所有以字母開頭的文件
[root@kittod ~]# ls [A-z]*
BC1 BC2 BC3 m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh
n71 n72 n73
5、顯示所有數字開頭的文件
[root@kittod ~]# ls [0-9]*
12a 12b 12c 12d
6、查看所有不區分大小寫的字母開頭的文件
[root@kittod ~]# ls [[:alpha:]]*
BC1 BC2 BC3 m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh
n71 n72 n73
7、查看所有以數字開頭的文件
[root@kittod ~]# ls [[:digit:]]*
12a 12b 12c 12d
8、查看所有以字母或者數字開頭的文件
[root@kittod ~]# ls [[:alnum:]]*
12a 12b 12c 12d BC1 BC2 BC3 m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh n71 n72 n73
10.2 正則表達式介紹和使用
在Linux命令行操作或者SHELL編程中總是容易混淆一些特殊字符的使用,比如元字符‘*’號,作為通配符匹配文件名時表示0個到無窮多個任意字符。而作為正則表達式匹配字符串時,表示重復0個到無窮多個的前一個字符。對于通配符和正則表達式之間容易理解的方法就是,在文本過濾命令中這些元字符是用做正則表達式,比如像awk,sed,grep等,主要是針對文件內容的。然而通配符多用在文件名上,比如查找find,ls,cp,mv等等。沒有特殊說明,正則表達式就是指基礎正則表達式。
10.2.1 什么是正則表達式
正則表達式是通過一些特殊字符的排列,用以查找、替換、刪除一行或多行文字字符串,簡單的說,正則表達式就是用在字符串的處理上面的一項表示式。由于正則表達式語法簡練,功能強大,得到了許多程序設計語言的支持,包括Java、C++、Perl以及Shell等。
10.2.2 為什么使用正則表達式
在進行程序設計的過程中,用戶會不可避免地遇到處理某些文本的情況。有的時候,用戶還需要查找符合某些比較復雜規則的字符串。對于這些情況,如果單純依靠程序設計語言本身,則往往會使得用戶通過復雜的代碼來實現。但是,如果使用正則表達式,則會以非常簡短的代碼來完成。
10.2.3 如何學習正則表達式
1. 重點在于理解元字符
2. 掌握好正則表達式的語法
3. 開拓思路,尋找最佳的表達方法
10.2.4 如何使用正則表達式
當一個正則表達式完成之后,并能夠保證這個表達式一定是準確的,需要不斷地測試才可以確定其正確與否。在不同的環境下,用戶需要不同的工具來幫助他完成測試的過程。如果是在Shell命令行中,用戶可以使用grep命令來測試。
grep家族有三大成員分別為:
grep:支持使用基本正則表達式。
egrep:支持使用擴展正則表達式。
fgrep:不支持使用正則表達式,即所有的正則表達式中的元字符都將作為一般字符,僅僅擁有其字面意義,不再擁有特殊意義。
grep命令的名稱來自于全局搜索正則表達式并打印文本行(Global Search Regular Expression and Print out the line)的縮寫。它是一個非常古老的UNIX命令,也是一種強大的文本搜索工具。grep命令使用正則表達式來搜索文本,并且把匹配的文本行打印出來。
grep命令根據用戶指定的”pattern(過濾條件)“對目標文本逐行進行匹配檢查;打印出符合條件的行,即文本搜索工具。注:PATTERN即過濾條件指由文本字符及正則表達式元字符所編寫的字符串。
grep命令的基本語法如下:grep [options] pattern [file…]
在上面的語法中,options表示選項,選項列表如下表。pattern表示要匹配的模式,file表示
一系列的文件名。grep命令會從一個或者多個文件中搜索滿足指定模式的文本行,并且打印出
來。模式后面的所有的字符串參數都被看作是文件名。
-n :顯示行號
-o :只顯示匹配的內容
-q :靜默模式,沒有任何輸出,得用$?來判斷執行成功沒有,即有沒有過濾到想要的內容
-l :如果匹配成功,則只將文件名打印出來,失敗則不打印,通常-rl一起用,grep -rl
'root' /etc
-A :如果匹配成功,則將匹配行及其后n行一起打印出來
-B :如果匹配成功,則將匹配行及其前n行一起打印出來
-C :如果匹配成功,則將匹配行及其前后n行一起打印出來
--color:高亮顏色顯示匹配到的字符串
-c :如果匹配成功,則將匹配到的行數打印出來
-E :等于egrep,擴展
-i :忽略大小寫
-v :取反,不匹配
-w:匹配單詞
-r:遞歸搜索,不僅搜索當前目錄,還要搜索其各級子目錄
-s:不顯示關于不存在或者無法讀取文件的錯誤信息
10.3 基本正則表達式
基本正則表達式(Basic Regular Expression,BRE),又稱為標準正則表達式,是最早制訂的正則表達式規范,僅支持最基本的元字符集。基本正則表達式是POSIX規范制訂的兩種正則表達式語法標準之一,另外一種語法標準稱為擴展正則表達式。
示例:
1)^word 表示搜索以word開頭的內容。
[root@server ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@server ~]# grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash
2)word$ 表示搜索以word結尾的內容。
[root@server ~]# grep bash passwd
root:x:0:0:root:/root:/bin/bash
fox:x:1000:1000::/home/fox:/bin/bash
cel:x:1001:1001::/home/cel:/bin/bash
[root@server ~]# grep bash$ passwd
root:x:0:0:root:/root:/bin/bash
fox:x:1000:1000::/home/fox:/bin/bash
cel:x:1001:1001::/home/cel:/bin/bash
3)^$ 表示空行,不是空格。
[root@server ~]# grep ^$ passwd [root@server ~]# grep ^$ passwd -n
18:
19:
20:
25:
29:
4). 代表且只能代表一個任意字符。
[root@server ~]# grep r.t passwd
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@server ~]# grep r..t passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@server ~]# grep r...t passwd
unbound:x:997:996:Unbound DNS resolver:/etc/unbound:/sbin/nologin
5)* 重復0個或多個前面的字符
[root@server ~]# grep r*t passwd
6)[] 匹配字符集合內任意一個字符,如[a-z]
[root@server ~]# grep r[a-z]t passwd
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@server ~]# grep r[a-z]*t passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
systemd-timesync:x:988:988:systemd Time Synchronization:/:/usr/sbin/nologi
7. [^abc]在中括號里表示非,不包含a或b或c
[root@server ~]# grep r[^a-z]*t passwd
rt
r.t
r..t
8){n,m} 匹配n到m次,前一個字符。
{n,} 至少N次,多了不限。
{n} n次
{,m} 至多m次,少了不限。
注意:grep要將{}轉義,{},egrep不需要轉義
[root@kittod ~]# grep 'r[^a-z]\{3,\}' passwd
[root@kittod ~]# grep -E 'r[^a-z]{3,}' passwd
10.4 擴展正則表達式
擴展正則表達式(Extended Regular Expression,ERE)支持比基本正則表達式更多的元字符,但是擴展正則表達式對有些基本正則表達式所支持的元字符并不支持。前面介紹的元字符“^”、“$”、“.”、“*”、“[]”以及“[^]”這6個元字符在擴展正則表達式都得到了支持,并且其意義和用法都完全相同,不再重復介紹。接下來重點介紹一下在擴展正則表達式中新增加的一些元字符。
10.5 正則表達式案例
1、顯示/etc/passwd文件中以bash結尾的行;
[root@server ~]# grep bash$ /etc/passwd
2、找出/etc/passwd文件中的三位或四位數;
[root@server ~]# grep '[[:digit:]]\{3,4\}' /etc/passwd
[root@server ~]# grep -E '[[:digit:]]{3,4}' /etc/passwd
3、找出/etc/grub2.cfg文件中,以至少一個空白字符開頭,后面又跟了非空白字符的行;
[root@server ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
4、找出"netstat -tan”命令的結果中,以‘LISTEN’后跟0個或多個空白字符結尾的行;
[root@server ~]# netstat -tan | grep "LISTEN[[:space:]]*$"
5、找出"fdisk -l“命令的結果中,取出硬盤路徑;
[root@server ~]# fdisk -l | grep Disk | grep /dev/nv | cut -d: -f 1 | cut -d " " -f2
6、找出”ldd /usr/bin/cat“命令的結果中文件路徑;
[root@server ~]# ldd /usr/bin/cat | egrep [[:blank:]]\+/[[:graph:]]*
7、找出/proc/meminfo文件中,所有以大寫或小寫s開頭的行
[root@server ~]# grep -i ^S /proc/meminfo
8、顯示當前系統上root、centos或spark用戶的相關信息;
[root@server ~]# grep -E ^"(root|centos|spark)" /etc/passwd
[root@server ~]# egrep ^"(root|centos|spark)" /etc/passwd
9、echo輸出一個絕對路徑,使用egrep取出其基名;
[root@server ~]# echo /mnt/sdc/ | grep -E -o "[^/]+/?$" | cut -d "/" -f 1
10、找出ifconfig命令結果中的1-255之間的整數;
[root@server ~]# ifconfig | egrep -w "[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]"
11. 找出ifconfig命令輸出中的所有IP地址
[root@server ~]# ifconfig | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
10.6 正則表達式練習
1、顯示/etc/rc.d/rc.sysinit文件中以不區分大小的h開頭的行;
[root@server ~]# grep -i ^h /etc/rc.d/rc.sysinit
2、顯示/etc/passwd中以sh結尾的行;
[root@server ~]# grep sh$ /etc/passwd
3、顯示/etc/fstab中以#開頭,且后面跟一個或多個空白字符,而后又跟了任意非空白字符的行;
[root@server ~]# grep -E ^#[[:space:]]+[^[:space:]]* /etc/fstab
或者
[root@server ~]# grep -E ^#[[:space:]]\{1,\}[^[:space:]]* /etc/fstab
4、查找/etc/rc.d/rc.local中包含“以to開始并以to結尾”的字串行;
[root@server ~]# grep -E to[A-z]*to /etc/inittab