正則表達式(Regular Expression)是通過一些特殊字符的排列,來表示控制或者通配的功能,用于查找,替換,刪除一行或者多行文字字符串,是用在字符處理上的一項表達式,有時候我們可通過表達式來篩選出我們所需要的信息。
正則表達式分為兩類:基本正則表達式(BRE)和擴展的正則表達式(ERE)
正則表達式基本上是一種“表示法”,只要工具程序支持這種表示法,那么該工具就可以用來做字符串處理,例如vim,grep,awk,sed….等
基本正則表達式的元字符:
我們這里基本正則表達式的元字符和giobbing的元字符有些相似,也有些不同.這里我們應該忘記giobbing的元字符來重新學習正則表達式的元字符,這里不能混淆!giobbing只是shell里面支持的文件名通配
字符匹配:
.:匹配任意單個字符;
[ ]:匹配指定范圍的任意單個字符;
[^]:匹配指定范圍之外的任意單個字符;
匹配的字符集:
[:digit:];所有的數字
[:lower:];所有的小寫字母
[:upper:];所有的大寫字母
[:alpha:];所有的字母
[:punct:];所有標點符號
[:space:];空白字符
[:alunm:];所有字母和數字
匹配次數
要用在指定出現次數字符的后面,用于限制其前面字符出現的次數;默認工作在貪婪模式中
*:匹配其前面的字符任意次;0次1次或者多次
例如:grep "t*b"
txxbb:匹配;t有出現一次
yxb:匹配;t有出現0次
tttttttpb :匹配;t有出現多次
abc:匹配;t有出現0次
\?:匹配其前面的字符0次或1次,即前面的字符可有可無;
\+:匹配其前面的字符1次或者多次,即前面的字符至少要出現一次;
\{m\}:匹配其前面的字符m次;
\{m,n\}:匹配其前面的字符至少m次;至多n次;
\{0,n\}:至多n次;
\{m,\}:至少m次;
位置錨定;用來控制匹配字符串的位置
^:行首錨定;用于匹配模式的最左側;
$:行尾錨定;用于匹配模式的最右側
兩者結合就表示錨定的是空白行
^$:空白行
^[[:space:]]*$:空白行或者包含了空白行的字符
我們這里也可以使用\<PATTERN\>來匹配完整的單詞
需要強調的是我們這里所指的單詞是由非特殊字符組成的連續字符或字符串都稱為單詞
詞首和詞尾的錨定也可以使用另一種方式來錨定,這里要用到上面單詞匹配的模式由轉義符\加><或者b來表示;
\<或者\b:詞首錨定;用于單詞模式的左側
\>或\b:詞尾錨定;用于單詞模式的右側
分組及引用
如果我們需要匹配兩個字符而且出現多次怎么辦?這里我們就要用到分組
分組可以用括號括起來,但是括號在bash的命令行里面是有特殊含義的,所以我們這里需要用到轉義符\
\(\):將一個或者多個字符捆綁在一起,當做一個整體
\(xy\)*ab
這里就表示xy這組符號要出現0次或者多次
分組括號里面的模式匹配到的內容還可以被引用,其內容會被正則表達式引擎自動記錄到內部變量中;需要引用的話要用到\1,\2,\3,…..等等
\1:表示從模式左側起,第一個左括號和與之匹配的右括號之間被模式匹配到的字符
\2:表示從模式左側起,第二個左括號與之匹配的右括號之間被模式匹配到的字符
\3:…….
文本處理工具grep
在Linux里面所有的配置文件都是以純文本格式來展現出來的,所以在Linux里面文本的處理是及其重要的,可以幫助我們更好的提高效率
Linux上有文本處理工具三劍客,他們各自都有著強大的文本處理能力
awk:文本報告生成器
sed:流編輯器,文本編輯工具
grep:文本過濾工具
今天主要講grep(Global search REgular expression and print out line)
作用:文本搜索工具,根據用戶指定的“模式”也就是過濾條件來對目標文件進行逐行匹配并打印匹配到的行
grep工具可以分為三類:
1.grep:支持基本的正則表達式
2.egrep:支持擴展的正則表達式
3.fgrep:不支持正則表達式
這前兩個都可以加選項來表示轉換為另外兩個;(grep -E)=egrep ;(grep -F)=fgrep;(egrep -G,-F)
grep命令
grep:文本過濾工具 grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...] --color=auto:對匹配到的文本著色高亮顯示 -i:igorecase,忽略字符的大小寫 -o:僅顯示匹配到的字符串本身 -v:顯示不能被模式匹配到的行 -E:支持使用擴展正則表達式元字符 -q:--quit,靜默模式,即不輸出任何信息 -A #:顯示匹配到的行后#行 -B #:顯示匹配到的行前#行 -C #:顯示匹配到的行前后各#行 gerp默認只顯示匹配到的行 egrep:支持擴展的正則表達式來實現類似于grep的文本過濾工具 egrep [OPTIONS] PATTERN [FILE...] -i: -o: -v: -q: -A: -B: -C: -g:支持基本正則表達式 fgrep:不支持正則表達式元字符 當不需要用到正則表達式字符編寫模式的時候,使用fgrep能更好
文本查看及處理工具
wc:文本統計 wc [OPTION]... [FILE]... -l:lines;統計有多少行 -w:words;統計有多少單詞 -c:bytes;統計有多少字節 cut:以某個字符段來切割顯示文件內容 cut OPTION... [FILE]... -d CHAR:以指定的字符為分隔符; -f FILEDS:要挑選出的字符串 \#:指定的單個字符; \#-\#:連續的多個字段; \#,\#:離散的多個字段; sort:對文本進行排序并輸出 sort [OPTION]... [FILE]... -n:基于數值大小而非字符進行排序; -t CHAR:指定分隔符 -k \#:用于排序比較的字段; -r:逆序排列; -f:忽略字符大小寫; -u:重復的行只保留一份 uniq:報告或者移除重復的行 uniq [OPTION]... [INPUT [OUTPUT]] -c:顯示每行的重復次數 -u:僅顯示沒有重復的行 -d:僅顯示重復過的行 duff:逐行進行比較文件 diff [OPTION]... FILES
練習
新建文件lovers.txt;匹配以l開頭中間有兩個任意字符并以e結尾的字符串后面可以為任意長度的任意字符的行看那個匹配
He loves his lover. He likes his lover. She likes her liker. She loves her liker.
grep “\(l..e\).*” lovers.txt
練習:
1、顯示/etc/passwd文件中不以/bin/bash結尾的行;
grep -v "\(/bin/bash\)$" /etc/passwd
2、找出/etc/passwd文件中的兩位數或三位數;
grep "\<[0-9]\{2,3\}\>" /etc/passwd
3.找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一個空白字符開頭,且后面非空白字符的行;
grep "^[[:space:]]\+[^[space:]]" /etc/grub2.cfg
4.找出"netstat -tan"命令的結果中以'LISTEN'后跟0、1或多個空白字符結尾的行;
netstat -tan | grep "\<LISTEN\>[[:space:]]*"
原創文章,作者:N24-執念,如若轉載,請注明出處:http://www.www58058.com/64285