1. 程式人生 > >正則表達式和擴展正則表達式

正則表達式和擴展正則表達式

技術 文本搜索工具 ring pos 在一起 grep -w 並排 十進制 關系

一. 正則表達式

1. grep 文本過濾(模式:pattern)工具 :

作用:文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查;打印匹配到的行

模式:由正則表達式字符及文本字符所編寫的過濾條件

 格式:grep [OPTIONS] PATTERN [FILE...]
          命令選項:
             --color=auto: 對匹配到的文本著色顯示
             -v:  顯示不被pattern匹配到的行
             -i:  忽略字符大小寫
             
-n: 顯示匹配的行號 -c: 統計匹配的行數 -o: 僅顯示匹配到的字符串 -q: 靜默模式,不輸出任何信息 -A #: after, 後#行 -B #: before, 前#行 -C #:context, 前後各#行 -e:實現多個選項間的邏輯or關系 例子: grep –e ‘cat ’ -e ‘dog’ file 匹配含有字符串“cat”或 "dog"的行
-w:匹配整個單詞 -E:使用ERE -f: 批量匹配文件中的字符串 例子: grep -f file file文件中存要匹配的內容(將行的內容作為要匹配的字符串;多行之間屬於或的關系,相當於 -e) -F:相當於fgrep,不支持正則表達式

2. 基本正則表達式(BRE)

元字符分類:字符匹配、匹配次數、位置錨定、分組

i. 字符匹配: . 匹配任意單個字符 # 需要匹配“.”字符時,用 \. 或 [.] 表示
[] 匹配指定範圍內的任意單個字符 [^] 匹配指定範圍外的任意單個字符 [:alnum:] 字母和數字 [:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z [:lower:] 小寫字母 [:upper:] 大寫字母 [:blank:] 空白字符(空格和制表符) [:space:] 水平和垂直的空白字符(比[:blank:]包含的範圍廣) [:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...) [:digit:] 十進制數字 [:xdigit:]十六進制數字 [:graph:] 可打印的非空白字符 [:print:] 可打印字符 [:punct:] 標點符號 ii. 匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數 * 匹配前面的字符任意次,包括0次 貪婪模式:盡可能長的匹配 .* 任意長度的任意字符 \? 匹配其前面的字符0或1次 \+ 匹配其前面的字符至少1次 (非貪婪模式) \{n\} 匹配前面的字符n次 \{m,n\} 匹配前面的字符至少m次,至多n次 \{,n\} 匹配前面的字符至多n次 \{n,\} 匹配前面的字符至少n次 iii. 位置錨定:定位出現的位置 ^ 行首錨定,用於模式的最左側 $ 行尾錨定,用於模式的最右側 ^PATTERN$ 用於模式匹配整行 ^$ 空行 ^[[:space:]]*$ 空白行 \< 或 \b 詞首錨定,用於單詞模式的左側 \> 或 \b 詞尾錨定;用於單詞模式的右側 \<PATTERN\> 匹配整個單詞 iv. 分組:\(\) 將一個或多個字符捆綁在一起,當作一個整體進行處理,如:\(root\)\+ 分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式為: \1, \2, \3, ... \1 表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符 示例: \(string1\+\(string2\)*\) \1 :string1\+\(string2\)* \2 :string2 註: 後向引用:引用前面的分組括號中的模式所匹配字符,而非模式本身 技術分享圖片 或者:\| 示例:a\|b: a或b C\|cat: C或cat \(C\|c\)at:Cat或cat
3. 擴展正則表達式(ERE)

擴展正則表達式的元字符:字符匹配、匹配次數、位置錨定、分組 (與基本正則表達式基本相同;用法相似,除了詞首、詞尾錨定一樣,其他只是在基本正則表達式中去掉轉義字符)

與基本正則表達式的比較:寫法上比較簡單,去掉了大量的轉義字符;但需要匹配特殊字符時,擴展正則表達式需將特殊字符用 [] 括起來使用,這時用基本正則表達式比較方便
   格式: egrep [OPTIONS] PATTERN [FILE...]
          egrep = grep -E(等價)
i. 字符匹配 (與基本正則表達式基本相同) ii. 位置錨定: ^ :行首 $ :行尾 \<, \b :語首 \>, \b :語尾 iii. 分組: () 後向引用:\1, \2, ... iv. 或者: 示例: a|b: a或b C|cat: C或cat (C|c)at:Cat或cat

二. 正則表達式例題:

1、顯示/proc/meminfo文件中以大小s開頭的行(要求:使用兩種方法) i. cat /proc/meminfo |grep -i "^s" ii. cat /proc/meminfo |grep "^\(s\|S\)" 2、顯示/etc/passwd文件中不以/bin/bash結尾的行 cat /etc/passwd |grep -v ":/bin/bash$" 3、顯示用戶rpc默認的shell程序 cat /etc/passwd |grep -w "^rpc" |cut -d: -f 7 4、找出/etc/passwd中的兩位或三位數 cat /etc/passwd |grep -wo "[[:digit:]]\{2,3\}" 5、顯示CentOS7的/etc/grub2.cfg文件中,至少以一個空白字符開頭的且後面有非空白字符的行 cat /etc/grub2.cfg | grep "^[[:space:]]\+[^‘ ‘].*" 或 cat /etc/grub2.cfg | grep "^[[:space:]]\+[^[:space:]].*" 6、找出“netstat -tan”命令結果中以LISTEN後跟任意多個空白字符結尾的行 netstat -tan | grep ".*LISTEN[[:space:]]*$" 7、顯示CentOS7上所有系統用戶的用戶名和UID cat /etc/passwd |cut -d: -f1,3 |grep -w "[1-9][0-9]\{,2\}$" 8、添加用戶bash、testbash、basher、sh、nologin(其shell為/sbin/nologin),找出/etc/passwd用戶名和shell同名的行 cat /etc/passwd |grep -w "^\([^:]*\):.*/\1$" 9、利用df和grep,取出磁盤各分區利用率,並從大到小排序 df |grep "^/dev/sd"|grep -wo "[0-9]\+%"|sort -nr 10、顯示三個用戶root、mage、wang的UID和默認shell cat /etc/passwd |grep -w "^\(root\|mage\|wang\)" |cut -d: -f 3,7 11、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)後面跟一個小括號的行 cat /etc/rc.d/init.d/functions |grep -i "^\([_[:alnum:]]\+(\)" 12、使用egrep取出/etc/rc.d/init.d/functions中其基名 echo "/etc/rc.d/init.d/functions" | grep -Eo "[^/]*[/]?$"|tr -d "/" 13、使用egrep取出上面路徑的目錄名 echo "/etc/rc.d/init.d/" | grep -Eo "..*[/]\<" 14、統計last命令中以root登錄的每個主機IP地址登錄次數 last |grep -w "^root.*\<pts" | grep -wE "((([0-9])|([1-9][0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-9])|([1-9][0-9])|(1[0-9]{,2})|(2[0-4][0-9])|(25[0-5])){1}[[:space:]]" |tr -s " "|cut -d " " -f3|sort|uniq -c 15、利用擴展正則表達式分別表示0-9、10-99、100-199、200-249、250-255 [0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5] 16、顯示ifconfig命令結果中所有IPv4地址 ifconfig |grep -owE "((([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-9]{1,2})|(1[0-9]{,2})|(2[0-4][0-9])|(25[0-5])){1}[[:space:]]" 17、將此字符串:welcome to magedu linux 中的每個字符去重並排序,重復次數多的排到前面 cat test | grep -o "[[:lower:]]"|sort |uniq -c|sort -nr |tr -s ‘ ‘ | cut -d " " -f 3 |tr -d ‘\n‘ 註:匹配有效ip地址: i. grep -owE "((([0-9])|([1-9][0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-9])|([1-9][0-9])|(1[0-9]{,2})|(2[0-4][0-9])|(25[0-5])){1}[[:space:]]" -E : 代表擴展正則表達式 ii. grep -owE "((([0-9]{1,2})|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-9]{1,2})|(1[0-9]{,2})|(2[0-4][0-9])|(25[0-5])){1}[[:space:]]"

正則表達式和擴展正則表達式