Shell入門07 -- 正則表達(dá)式,grep,sed,awk命令

Shell正則

  • 正則表達(dá)式是為處理大量的字符串而定義的一套規(guī)則和方法,通過定義的這些特殊符號的輔助,系統(tǒng)管理員就可以快速過濾,替換或輸出需要的字符串;
  • 最常 應(yīng)用正則表達(dá)式 的命令有grepsed,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ù);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容