Linux之shell脚本正则表达式
一、管道命令
1.sort
是一個以行為單位對文件內容進行排序的工具,也可以根據不同的數據類型來排序。例如數據和字符的排序就不一樣
 語法:
 sort [選項] 參數
常用選項
 -t:指定分隔符,默認使用[Tab]吧 鍵或空格分隔
 -k:指定排序區域,哪個區間排序
 -n:按照數字進行排序,默認是以文字形式排序
 -u:等同于 uniq,表示相同的數據僅顯示一行,注意:如果行尾有空格去重就不成功
 -r:反向排序,默認是升序,-r就是降序
 -o:將排序后的結果轉存至指定文件
2.uniq
主要用于去除連續的重復行
 注意:是連續的行,所以通常和sort結合使用先排序使之變成連續的行再執行去重操作,否則不連續的重復行他不能去重
(1)語法
 uniq [選項] 參數
(2)常用選項
 -c:對重復的行進行計數;
 -d:僅顯示重復行;
 -u:僅顯示出現一次的行
3.tr
它可以用一個字符來替換另一個字符,或者可以完全除去一些字符,也可以用它來除去重復字符
語法
 用法:tr [選項]… SET1 [SET2]
 從標準輸入中替換、縮減和/或刪除字符,并將結果寫到標準輸出。
常用選項
 -d 刪除字符
 -s 刪除所有重復出現的字符,只保留第一個
4.cut
顯示行中的指定部分,刪除文件中指定字段
 -f 通過指定哪一個字段進行提取。cut命令使用“TAB”作為默認的字段分割符
 -d “TAB”是默認的分隔符,使用此選項可更改為其他的分隔符
- -complement 用于排除所指定的字段
- -output-delimiter 更改輸出內容的分隔符
二、正則表達式
1.正則表達式的定義
正則表達式—通常用于判斷語句中,用來檢查某一字符串是否滿足某一格式
 正則表達式是由普通字符與元字符組成
 普通字符包括大小寫字母、數字、標點符號及一些其他符號
 元字符是指在正則表達式中具有特殊意義的專用字符,可以用來規定其前導字符(即位于元字符前面的字符)在目標對象中的出現模式
正則表達式組成
 普通字符包括大小寫字母、數字、標點符號及一些其他符號。
 元字符是指在正則表達式中具有特殊意義的專用字符
LINUX 中常用的有兩種正則表達式引擎
 基礎正則表達式:BRE
 擴展正則表達式: ERE
2.常見元字符(支持的工具:find、grep、egrep、sed和awk)
. 表示任意一個字符
 [ ] 匹配括號中的一個字符
 ^ 表示否定括號中出現字符類中的字符,取反
 \轉義字符 用于取消特殊符號的含義
 ^ 匹配字符串開始的位置
 $ 匹配字符串結束的位置
 {n} 匹配前面的子表達式n次
 {n,} 匹配前面的子表達式不少于n次
 {n,m} 匹配前面的子表達式n到m次
 [:alnum:] 匹配任意字母和數字
 [:alpha:] 匹配任意字母,大寫或小寫
 [:lower:] 小寫字符a-z
 [:upper:] 大寫字符A-Z
 [:blank:] 空格和TAB字符
 [:space:] 所有空白字符( 新行、空格、制表符)
 [:digit:] 數字 0-9
 [:xdigit:] 16 進制數字
 [:cntrl:] 控制字符
表示任意一個字符
#表示任意一個字符 [root@yxp data]#echo abc|grep "a.c" abc #原來的點需要加\轉義 [root@yxp data]#echo abc|grep "a\.c"#標準格式需要加'' 或者"" [root@yxp data]#echo abc a.c|grep "a\.c" abc a.c[root@yxp data]#echo abc adc|grep "a.c" abc adc[ ] 匹配括號中的一個字符
#[yxp] [root@yxp opt]#ls |grep "[yxp].txt" p.txt x.txt y.txt yxp.txt#[0-9] [root@yxp opt]#ls |grep "[0-9].txt" 0.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt#{a..d} [root@yxp aa]#touch {a..z}.txt [root@yxp aa]#ls a.txt e.txt i.txt m.txt q.txt u.txt y.txt b.txt f.txt j.txt n.txt r.txt v.txt z.txt c.txt g.txt k.txt o.txt s.txt w.txt d.txt h.txt l.txt p.txt t.txt x.txt#{A..Z} [root@yxp bb]#touch {A..Z}.txt [root@yxp bb]#ls A.txt E.txt I.txt M.txt Q.txt U.txt Y.txt B.txt F.txt J.txt N.txt R.txt V.txt Z.txt C.txt G.txt K.txt O.txt S.txt W.txt D.txt H.txt L.txt P.txt T.txt X.txt#[a-d]:包括小a到小d,還有大寫的,除了D [root@yxp opt]#ls [a-d].txt a.txt A.txt b.txt B.txt c.txt C.txt d.txt ##只想匹配小寫(需要結合grep) [root@yxp opt]#ls |grep '[a-d].txt' a.txt b.txt c.txt d.txt#[A-D]:不包括小a [root@yxp opt]#ls [A-D].txt A.txt b.txt B.txt c.txt C.txt d.txt D.txt ##[A-D]只想匹配大寫 [root@yxp opt]#ls |grep '[A-D].txt' A.txt B.txt C.txt D.txt [root@yxp opt]#ls |grep "[^yxp].txt" 0.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt a.txt .........后面省略[root@yxp opt]#echo 12txt|grep "[^az].txt" 12txt[:alnum:]匹配任意字母和數字
##注意:一定要在外面再套一個[ ] [root@yxp opt]#ls |grep '[[:alnum:]].txt' 0.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt[:alnum:]匹配任意字母和數字
##注意:一定要在外面再套一個[ ] [root@yxp opt]#ls |grep '[[:alnum:]].txt' 0.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt元字符:(.)
#//表示rc. rc0 ... rc6 [root@yxp opt]#ls /etc/ |grep 'rc[.0-6]' rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.d rc.local#r..t ..表示任意兩個字符 [root@yxp opt]#grep "r..t" /etc/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/nologin2.擴展正則表達式
擴展正則表達式(支持的工具:egrep、awk)
 通常情況下會使用基礎正則表達式就已經足夠了,但有時為了簡化整個指令,需要使用 范圍更廣的擴展正則表達式。例如,使用基礎正則表達式查詢除文件中空白行與行首為“#”
 之外的行(通常用于查看生效的配置文件),執行“grep -v‘^KaTeX parse error: Expected group after '^' at position 21: ….txt | grep -v‘^?#’”即可實現。這里需要使用管…|^#’test.txt”,其中,單引號內的管道符號表示或者(or)。
 此外,grep 命令僅支持基礎正則表達式,如果使用擴展正則表達式,需要使用 egrep 或 awk 命令。awk 命令在后面的小節進行講解,這里我們直接使用 egrep 命令。egrep 命令與 grep 命令的用法基本相似。egrep 命令是一個搜索文件獲得模式,使用該命令可以搜索文件中的任意字符串和符號,也可以搜索一個或多個文件的字符串,一個提示符可以是單個字符、一個字符串、一個字或一個句子。
 與基礎正則表達式類型相同,擴展正則表達式也包含多個元字符,常見的擴展正則表達 式的元字符主要包括以下幾個.
- 匹配前面子表達式0次或者多次? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .* 任意長度的任意字符? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 匹配前面子表達式0次或者1次,即:可有可無
- 與星號相似,表示其前面字符出現一次或多次,但必須出現一次,>=1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {n,m} 匹配前面的子表達式n到m次? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {m} 匹配前面的子表達式n次? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {n,} 匹配前面的子表達式不少于n次 >=n? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{,n} 匹配前面的子表達式最多n次,<=n? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| 用邏輯OR(或)方式指定正則表達式要是用的模式? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?() 字符串分組,將括號中的字符串作為一個整體。
*匹配前面子表達式0次或者多次
[root@yxp opt]#echo google ggle|grep "go*gle" google ggle[root@yxp opt]#echo google ggle gggle|grep "go*gle" google ggle gggle{n,m}匹配前面的子表達式n到m次
[root@yxp opt]#echo goooogle goole gggle|egrep "go{3,5}gle" goooogle goole gggle{n,} 匹配前面的子表達式不少于n次 >=n
[root@yxp opt]#echo goooogle gooogle gggle|egrep "go{3,}gle" goooogle gooogle gggle- 匹配前面子表達式0次或者多次 [root@yxp opt]#echo gggggggggggdadasgle|grep 'g*gle'
gggggggggggdadasgle
 .*任意長度的任意字符 [root@yxp opt]#echo gggggggggggdadasgle|grep '.*gle' gggggggggggdadasgle?匹配前面子表達式0次或者1次,即:可有可無 [root@yxp opt]#echo goole gogle ggle|egrep "go?gle" goole gogle ggle+與星號相似,表示其前面字符出現一次或多次,但必須出現一次,>=1 [root@yxp opt]#echo google gogle ggle gooogle|egrep "go+gle" google gogle ggle gooogle| 邏輯OR(或)方式指定正則表達式要是用的模式 [root@yxp opt]#echo 1ee 1abc 2abc|egrep "1|2abc" 1ee 1abc 2abc() 字符串分組,將括號中的字符串作為一個整體。 [root@yxp opt]#echo 1ee 1abc 2abc|egrep "(1|2)abc" 1ee 1abc 2abc提取ip地址 #法一 [root@yxp opt]#ifconfig ens33|grep "netmask"|grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"|head -1 192.168.59.102#法二:使用了分組 [root@yxp opt]#ifconfig ens33|grep "netmask"|egrep -o '([0-9]{1,3}.){3}[0-9]{1,3}'|head -1 192.168.59.1023.位置錨定
位置限定符 說明
 ^ 行首錨定,用于模式的最左側
 $ 行尾錨定,用于模式的最右側
 PATTERN 用于模式匹配整行
 ^$ 空行
 1*$ 空白行
 < 或 \b 詞首錨定,用于單詞模式的左側(連續的數字,字母下劃線都算)
 >或 \b 詞尾錨定,用于單詞的右側
 <PATTERN> 匹配整個單詞
 行尾錨定,用于模式的最右側
行首錨定,用于模式的最左側
[root@yxp opt]#grep "^root" /etc/passwd root:x:0:0:root:/root:/bin/bash用于模式匹配整行,匹配的內容單獨在一行
[root@yxp opt]#echo root|grep "^root$" root< :只匹配右側的單詞
[root@yxp opt]#echo hello-123|grep "\<123" hello-123>:只匹配左側的單詞
[root@yxp opt]#echo hello-123 222|grep "hello\>" hello-123 222過濾出不是以#開頭的非空行
[root@yxp opt]#grep "^[^#]" /etc/fstab /dev/mapper/centos-root / xfs defaults 0 0 UUID=183ca7c7-1989-4f43-9e81-d2676192f5a4 /boot xfs defaults 0 0 /dev/mapper/centos-home /home xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 /dev/sdb1 /mnt xfs defaults 0 0[:space:]???
總結
以上是生活随笔為你收集整理的Linux之shell脚本正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: R语言学习笔记3_探索性/描述性数据分析
- 下一篇: 所谓技术团队绩效
