Shell正則
- 正則表達(dá)式是為處理大量的字符串而定義的一套規(guī)則和方法,通過定義的這些特殊符號的輔助,系統(tǒng)管理員就可以快速過濾,替換或輸出需要的字符串;
- 最常 應(yīng)用正則表達(dá)式 的命令有
grep,sed,awk
基礎(chǔ)的正則表達(dá)式
-
^word:匹配以word開頭的內(nèi)容; -
word$:匹配以word結(jié)尾的內(nèi)容; -
^$:表示空行; -
.:表示且只能代表任意一個(gè)字符; -
\:轉(zhuǎn)義字符即讓字符原有的含義失效; -
*: -
.*:匹配所有字符; -
[abc]:匹配含有abc的任意字符; -
[^abc]:匹配不含郵abc的任意字符; -
[a-z]:匹配包含小寫字母; -
[A-Z]:匹配包含大寫字母; -
[a-Z]:匹配包含所有字母; -
(www|888):匹配包含字符串www或888的字符; -
(a+):匹配字符a出現(xiàn)一次或多次的字符; -
ab(c|d):匹配包含字符串a(chǎn)bc或abd的字符; -
[[:digit:]]:匹配包含數(shù)字的字符; -
[[:lower:]]:匹配包含小寫字母的字符; -
[[:upper:]]:匹配包含大寫字母的字符; -
[[:alpha:]]:匹配包含所有字
母的字符;
grep
- 下面創(chuàng)建一個(gè)文本文件
test.txt,使用grep命令來測試上面的正則表達(dá)式,文本內(nèi)容如下:
I am liyanyan teacher!!
I teach Linux.
test
I like basketball sdasdasdfgd!
my jianshu is sdasdsfds.com
our site is fdsfgdsfd.com
my qq is 114335fdsfsda.
note 34710233454.
grep參數(shù)選項(xiàng)
-
grep -o:只打印出匹配到的字符; -
grep -E:支持?jǐn)U展元字符,即轉(zhuǎn)義字符; -
grep --color=auto 'root' /etc/passwd: --color=auto匹配的目標(biāo)文本有顏色顯示; - 利用
別名alias可以將grep --color=auto配置到系統(tǒng)的配置文件/etc/bashrc中去,這樣就不用每次都輸入了,找到/etc/bashrc文件然后利用sublime打開,在最后輸入alias grep='grep --color=auto',保存需要輸入密碼,獲取修改此系統(tǒng)文件的權(quán)限,如下所示:
image.png - 終端再來執(zhí)行
grep 'root' /etc/passwd,結(jié)果如下:
image.png -
grep -n 'root' /etc/passwd:打印行 包含root,有行號,默認(rèn)區(qū)分大小寫,-n表示打印行號; -
grep -n -i 'root' /etc/passwd:打印行 包含root,有行號,不區(qū)分大小寫,-i表示不區(qū)分大小寫; -
grep -n -i '^root' passwd: 打印行 包含root,有行號,以root開頭; -
grep -n -i -v '^root' passwd:打印行 包含root,有行號,不區(qū)分大小寫,不以root開頭,-v表示取反; -
grep -n -B 3 '^_svn' /etc/passwd:打印行 有行號,以_svn開頭的前面3行,-B 3表示目標(biāo)行的前面三行;
image.png -
grep -n -A 3 '^_svn' /etc/passwd:打印行 有行號,以_svn開頭的后面3行,-A 3表示目標(biāo)行的后面三行;
image.png -
grep -n -C 3 '^_svn' /etc/passwd:打印行 有行號,以_svn開頭的前面三行與后面3行,-C 3表示目標(biāo)行的前面3行與后面3行;
image.png -
grep -w 'macOS' /etc/passwd:打印行 包含macOS字符,-w表示按照指定字符搜索;
grep+正則表達(dá)式
-
grep "^m" test.txt:過濾以m開頭的行,會將過濾行打印出來,如下所示:
image.png -
grep "m$" test.txt:過濾以m結(jié)尾的行,會將過濾行打印出來,如下所示:
image.png -
grep -vn "^$" test.txt:將空行排除掉,然后打印出其他內(nèi)容,且打印出行號,如下所示:
image.png -
grep "." test.txt:匹配任意字符,不包括空行,如下所示:
image.png -
grep ".*" test.txt:匹配任意字符,包括空行,如下所示:
image.png -
grep "\.$" test.txt:匹配以點(diǎn)結(jié)尾的所有行,如下所示:
image.png -
grep "[abc]" test.txt:匹配包含abc的所有行,如下所示:
image.png -
grep "[0-9]" test.txt:匹配包含0-9的所有行,如下所示:
image.png -
grep "[a-z]" test.txt:匹配包含所有小寫字母; -
grep "[A-Z]" test.txt:匹配包含所有大寫字母; -
grep "[^a-z]" test.txt:匹配去除小寫字母的其他所有字符; -
grep "^[a-z]" test.txt:匹配以小寫字母開頭的內(nèi)容; -
grep "3\{2\}" test.txt:匹配字符3 重復(fù)出現(xiàn)2次; -
grep -E "3{2}" test.txt:匹配字符3 重復(fù)出現(xiàn)2次,有參數(shù)E,無需轉(zhuǎn)義字符; -
grep -E "3{1,3}" test.txt:匹配字符3 重復(fù)出現(xiàn)1-3次; -
grep -E "3{1,}" test.txt:匹配字符3,重復(fù)出現(xiàn)1次或1次以上; -
grep -E "(com)" test.txt:匹配字符串com的字符,如下:
image.png -
grep -E "(a+)" test.txt:匹配字符a,出現(xiàn)一次或者多次的字符,如下所示:
image.png -
grep "[[:digit:]]" test.txt:匹配包含數(shù)字的字符,如下:
image.png
sed
- sed是一個(gè)流編輯器,非交互的編輯器,它一次處理一行內(nèi)容;處理時(shí)將當(dāng)前處理的行存儲在臨時(shí)緩沖區(qū)中,也稱為模式空間,接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)中的內(nèi)容送往屏幕,接著處理下一行,這樣不斷重復(fù),直到文件末尾,文件內(nèi)容并沒有改變,除非你使用重定向存儲輸出;
- sed主要用來自動編輯一個(gè)或者多個(gè)文件,簡化對文件的反復(fù)操作,編寫轉(zhuǎn)換程序等;
sed命令
- sed [options] 'command' file
- sed與grep不一樣,不管是否找到指定的模式,退出狀態(tài)都是0,只有當(dāng)命令存在語法錯(cuò)誤時(shí),sed的退出狀態(tài)才是非0;
-
a:在當(dāng)前行添加一行或多行; -
c:用新文本修改(替換)當(dāng)前行中的文本; -
d:刪除行; -
i:在當(dāng)前行之前插入文本; -
l:列出非打印字符; -
p:打印匹配到的內(nèi)容; -
n:讀入下一輸入行,并從下一條命令而不是第一條命令開始對其處理; -
!:對所選行以外的所有行應(yīng)用命令;
sed參數(shù)選項(xiàng)
-
sed -n:取消默認(rèn)的輸出; -
sed -i:直接修改對應(yīng)的文件; -
sed -r:支持?jǐn)U展元字符,即轉(zhuǎn)義字符;
應(yīng)用
-
sed -n 'halt/p' test.txt:打印匹配halt的行; -
sed -n '2p' test.txt:打印第二行; -
sed -n '$p' test.txt:打印最后一行;
awk
- awk其名稱得自于它的創(chuàng)始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個(gè)字母;
- awk適合文本處理和報(bào)表生成,其語法較為常見,借鑒了某些語言的一些精華,如 C 語言等。在 linux 系統(tǒng)日常處理工作中,發(fā)揮很重要的作用,掌握了 awk將會使你的工作變的高大上;
- 通常,awk是
以文件的每一行 為處理單位的;awk每接收文件的一行,然后執(zhí)行相應(yīng)的命令,來處理文本;
awk參數(shù)
-
awk -F":" '{ print $1 }' hello.txt:-F參數(shù)用來指定分隔符:
awk命令
-
awk -F":" '{ print $1 }' hello.txt:其中print為打印命令,讀取hello.txt文件中的內(nèi)容,遍歷每一行以分隔符:隔開,然后打印每一行的第一個(gè)分隔字符串;
awk的內(nèi)置命令
-
NF:每一行經(jīng)過分隔符切割之后獲取的 字段的個(gè)數(shù); -
NR:文件的行數(shù);















