什么是正則表達式
基本正則表達式的元字符
擴展正則表達式
grep的基本理解
grep的基本選項
grep的應用實例
什么是正則表達式
正則表達式,又稱正規表示法、常規表示法。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表通常被用來檢索、替換那些符合某個模式的文本。(摘自百度百科)
個人理解:正則表達式是由一些特殊字符及文本所標寫的一種模式,通過搭配文本處理工具來搜索文本并將匹配數據打印出來。
正則表達式分類
基本的正則表達式(Basic Regular Expression 又叫vfr Basic RegEx 簡稱 BRE)
擴展的正則表達式(Extended Regular Expression 又叫 Extended RegEx 簡稱 ERE)
引擎:采用不同算法,檢查處理正則表達式的軟件模塊
基本正則表達式的元字符
. 單個字符 [] 匹配任意字符以內范圍 [^] 匹配任意字符以外的的范圍(取反) [:digit:]匹配任意數字 [:lower:]匹配任意小寫字母 [:upper:]匹配任意大寫字母 [:alpha:]匹配任意大小寫字母 [:space:]匹配任意空白或空格 [:punct:]匹配所有標點符號 [:alnum:]匹配所有字母和數字
*匹配前一個字符的0到任意次 .*任意字符的任意長度 \?匹配前面的字符0-1次 \+匹配前面字符的1次以上包括1次 \{n\}匹配前面字符n次 \{m,n\}匹配前面字符最少m,最多n次 \{,m\}最少m次 \{m,\}最多m次
^行首 $行尾 ^$空行 \<詞首錨定 \>詞尾錨定 \b詞首錨定 \b詞尾錨定 \<匹配整個單詞\>
將一個或多個字符綁定在一起作為一個整體處理
\(\)
例如:\(root\) 匹配一行中所有為root字符的組
例如:ab*c
表示的是b的任意次而不是說是ab的任意次,要實現這一功能,就可以使用分組\(ab\)*c
分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄在內部變量中,這些變量為:
\1:模式從左側開始,第一個左側括號以及與之匹配的右括號之間的模式所匹配到的字符
\2:模式從左側開始,第二個左側括號以及與之匹配的右括號之間的模式所匹配到的字符
括號可以內嵌但不能交叉
擴展正則表達式
擴展正則表達式的用法
erep -E或egrep
擴展正則表達式的元字符
字符匹配
.任意單個字符 []指定范圍內的字符 []不在范圍內的字符,取反
次數匹配
*匹配前面字符的任意次 ?匹配前面自0次或1次 +匹配前面字符至少1次以上包括1次 {n}匹配n次 {n,m}匹配至少n次最多m次
位置錨定
^行首 $行尾 ^$空行 \<,\b:句首 \>,\b:句尾 或者使用| A|b:A或b
grep的基本理解
文本搜索工具,通過正則表達式及文本字符編寫的過濾條件進行搭配來對文本進行匹配檢查,打印匹配并輸出結果。
grep基本選項
grep -i 不區分大小寫 grep -v 取反 grep -n 顯示行號 grep -c 顯示匹配的有多少行 grep -o 只顯示匹配的字符或其他 grep -q 靜默模式 就是不顯示匹配的結果,什么都不顯示 用echo %?得出上一條命令的結果 0為正確輸出 非0位錯誤的命令輸出 grep -A {number}匹配結果行后幾行 grep -B {number}匹配結果前幾行 grep -C {number}匹配結果的前后幾行 grep -e 關鍵字 -e 關鍵字 多個關鍵字作為匹配條件(不限制說一定要匹配前后,匹配前后其中一個) grep -w 匹配整個單詞不包含包括
grep的應用實例
1、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式)
[root@localhost ~]# grep -i "^s" /proc/meminfo SwapCached: 64 kB SwapTotal: 2097148 kB SwapFree: 2091288 kB Shmem: 6016 kB Slab: 228152 kB SReclaimable: 153116 kB SUnreclaim: 75036 kB [root@localhost ~]# grep -e "^S" -e "^s" /proc/meminfo SwapCached: 64 kB SwapTotal: 2097148 kB SwapFree: 2091288 kB Shmem: 6016 kB Slab: 228152 kB SReclaimable: 153116 kB SUnreclaim: 75036 kB
2、顯示/etc/passwd文件中不以/bin/bash結尾的行
[root@localhost ~]# grep -v "/bin/bash$" /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 sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin 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 systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin
3、顯示用戶rpc默認的shell程序
[root@localhost ~]# grep "\brpc\b" /etc/passwd |cut -d: -f7 /sbin/nologin
4、找出/etc/passwd中的兩位或三位數
[root@localhost ~]# grep "\b[[:digit:]]\{2,3\}\b" /etc/passwd mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin 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 systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:997:995:User for polkitd:/:/sbin/nologin colord:x:996:994:User for colord:/var/lib/colord:/sbin/nologin
5、顯示/etc/grub2.cfg文件中,至少以一個空白字符開頭的且后面存非空白字符的行
[root@localhost ~]# grep "^[[:space:]]\+[^[:space:]].*" /etc/grub2.cfg load_env set default="${next_entry}" set next_entry= save_env next_entry set boot_once=true set default="${saved_entry}" menuentry_id_option="--id" menuentry_id_option="" set saved_entry="${prev_saved_entry}" save_env saved_entry set prev_saved_entry= save_env prev_saved_entry set boot_once=true if [ -z "${boot_once}" ];
6、找出"netstat -tan"命令的結果中以'LISTEN'后跟0、1或多個空白字符結尾的行
[root@localhost ~]# netstat -tan |grep "LISTEN[[:space:]]*$" tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:631 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN tcp6 0 0 ::1:6010 :::* LISTEN
7、添加用戶bash、testbash、basher以及nologin(其shell為/sbin/nologin),而后找出/etc/passwd文件中用戶名同shell名的行
[root@localhost testdir]# grep "^\(\<.*\>\).*/\1$" passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt bash:x:1001:1001::/home/bash:/bin/bash nologin:x:1004:1004::/home/nologin:/sbin/nologin
原創文章,作者:snowbamboo,如若轉載,請注明出處:http://www.www58058.com/29854