15.基本正則表達式

1.正則表達式和通配符區別


通配符
功能:是匹配文件名的字符串

*:表示任意字符,例如:*.log  已.log結尾的文件
?:表示單個字符
[]:表示括號裏的任意字符
[^]:表示除了括號裏的字符
[0-9]: 匹配數字範圍
[a-z]:字母  顯示aA bB...z 沒有大寫Z
[A-Z]:字母  顯示A bB ……zZ 沒有小寫a
[:digit:]:任意數字,相當於0-9
[:lower:]:任意小寫字母
[:upper:]: 任意大寫字母
[:alpha:]: 任意大小寫字母
[:alnum:]:任意數字或字母

正則表達式
功能:功能比通配符功能要強,匹配的對象是文本內容的字符串,也可能是由其他命令輸出的內容。
正則表達式分爲:基本正則表達式和擴展正則表達式
查看幫助:man 7 regex

2.字符匹配


. : 表示任意單個字符。
* : 表示前面的字符連續出現任意次,包括0次。
.* :表示任意長度的任意字符,與通配符中的*的意思相同。
\  :表示轉義符,當與正則表達式中的符號結合時表示符號本身。
[  ]:表示匹配指定範圍內的任意單個字符。
[^ ]:表示匹配指定範圍外的任意單個字符。

[[:alpha:]]  表示任意一位大小寫字母。
[[:lower:]]  表示任意一位小寫字母。
[[:upper:]]  表示任意一位大寫字母。
[[:digit:]]  表示0到9之間的任意單個數字。
[[:alnum:]]  表示任意一位數字或字母。
[[:space:]]  表示任意空白字符,包括"空格"、"tab鍵"等。
[0-9]與[[:digit:]]等效。
[a-z]與[[:lower:]]等效。
[A-Z]與[[:upper:]]等效。
[a-zA-Z]與[[:alpha:]]等效。
[a-zA-Z0-9]與[[:alnum:]]等效。

3.次數匹配


\?  :表示匹配其前面的字符0或1次
\+  :表示匹配其前面的字符至少1次,或者連續多次,連續次數上不封頂。
\{n\} :表示前面的字符連續出現n次,將會被匹配到。
\{x,y\} :表示之前的字符至少連續出現x次,最多連續出現y次
\{,n\} :表示之前的字符連續出現至多n次,最少0次,都會陪匹配到。
\{n,\} :表示之前的字符連續出現至少n次,纔會被匹配到。

4.位置匹配


^:表示錨定行首,此字符後面的任意內容必須出現在行首,才能匹配。
$:表示錨定行尾,此字符前面的任意內容必須出現在行尾,才能匹配。
^$:表示匹配空行,這裏所描述的空行表示"回車",而"空格"或"tab"等都不能算作此處所描述的空行。
^abc$:表示abc獨佔一行時,會被匹配到。
\<或者\b :匹配單詞邊界,表示錨定詞首,其後面的字符必須作爲單詞首部出現。
\>或者\b :匹配單詞邊界,表示錨定詞尾,其前面的字符必須作爲單詞尾部出現。
\B:匹配非單詞邊界,與\b正好相反。

5.分組和後向引用


分組:a{2},這種是匹配單個字符,若干要匹配多個字符,就要分組,比如:(hello){2}

分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式爲: \1, \2, \3, …
\1 表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
示例: (string1+(string2)*) 紅色左括號代表第一個,黃色括號代表第二個
\1 :string1+(string2)*
\2 :string2
後向引用:引用前面的分組括號中的模式所匹配字符結果,而非模式本身
或者:|
示例:a|b: a或b 、C|cat: C或cat、 (C|c)at:Cat或cat

分組嵌套示例解釋:
echo “abefefabefef22”| grep “(ab(ef){2}){2}”
第一步把匹配模式裏的\去掉,得:(ab(ef){2}){2}
(ef){2}表示:”ef”這個整體出現2次,即efef,整體也就是:(abefef){2}
同理:(abefef){2}表示:”abefef”這個整體出現2次,即abefefabefef
以上就是一種嵌套分組,大的分組裏有個小分組

小結:
( ) 表示分組,我們可以將其中的內容當做一個整體,分組可以嵌套。
(ab) 表示將ab當做一個整體去處理。
\1 表示引用整個表達式中左邊第1個分組中的正則匹配到的結果。
\2 表示引用整個表達式中左邊第2個分組中的正則匹配到的結果。

6.練習


練習:

1、顯示/proc/meminfo文件中以大小s開頭的行(要求:使用兩種方法)

    #cat /proc/meminfo | grep "^[Ss]"
    #cat /proc/meminfo | grep -i "^S"

2、顯示/etc/passwd文件中不以/bin/bash結尾的行

#cat /etc/passwd | grep -v "/bin/bash$"

3、顯示用戶rpc默認的shell程序

#cat /etc/passwd | grep "\<rpc\>" |cut -d: -f7

4、找出/etc/passwd中的兩位或三位數

#cat /etc/passwd | grep -w "\<[0-9]\{2,3\}\>"

5、顯示CentOS7的/etc/grub2.cfg文件中,至少以一個空白字符開頭的且後面有非空白字符的行

#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

8、添加用戶bash、testbash、basher、sh、nologin(其shell爲/sbin/nologin),找出/etc/passwd用戶名和shell同名的行

#cat /etc/passwd |cut -d: -f1,7|tr "/" ":"|cut -d: -f1,4 | grep -o "\(\<.*\>\):\1"
#grep -o "\([[:alpha:]]\+\>\).*\<\1$" /etc/passwd

9、利用df和grep,取出磁盤各分區利用率,並從大到小排序

#df -h | grep "^/dev/sd*"|tr -s " " "%"|cut -d% -f5|sort -rn
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章