Shell——正則表達式及sed工具應用

一、查找特定字符(grep)

1、grep查找特定字符

-n 顯示行號

-n 顯示行號

-i 忽略大小寫

-v 反向查找

grep查找條件使用‘ ’ 單引號,查找內容會標紅
在這裏插入圖片描述

2、利用中括號“ [ ] ” 來查找集合字符

可匹配 [ ] 中的任意字符,例:shirt與short中,兩個單詞僅i與o不同,可使用[io]表示匹配 i 或 o

例如:[0-9] 匹配任意一位數字

在這裏插入圖片描述

  • 若要查找包含重複單個字符“oo”時,只需要執行以下命令即可

grep -n ’oo‘ yum.conf

在這裏插入圖片描述

  • 若查找“oo”前面不是“w”的字符串,只需要通過集合肌膚的反向選擇“[^]” 來實現。如執行 grep -n ‘[ ^w]oo’ yum.conf 命令,表示在文本中查找“oo”前面不是“w”的字符串

    ^放在括號裏面就是取反的意思,放在括號外面就是開頭的意思

    ‘ [ ^ w ] oo ’ 查找oo前面不是w的字符串

在這裏插入圖片描述

  • “^”符號在元字符集合“[ ]” 符號內外的作用時不一樣的,在[ ] 內則表示反向選擇,在[ ] 外則代表定位行首。反之,若想查找以某一特定字符結尾的行則可以使用“$”定位行尾。

例如:grep -n ’ \ .$ ’ yum.conf

查找以小數點(.)結尾的行。因爲小數點(.)在正則表達式中也是一個元字符,代表任意一個字符,所以自立需要用到轉義字符 “ \ ” ,將具有特殊意義的字符轉化爲普通字符

在這裏插入圖片描述

  • 查詢以小寫字母開頭的行可以通過 “ ^ [a-z] ” 規則來過濾

    查詢大寫字母開頭的行則可以通過 “ ^ [A-Z] ”來過濾

    若查詢不以字母開頭的行則使用 “ ^ [a-zA-Z] ”過濾

    例如:過濾出非大小寫字母內容:

在這裏插入圖片描述

例如:過濾出包含數字的行及數字

在這裏插入圖片描述

例如:過濾出以數字爲開頭的行

在這裏插入圖片描述

例如:過濾出非數字內容

在這裏插入圖片描述

  • 查找行首“^”與行尾字符“$”

基礎正則表達式包含兩個定位元字符:“”(行首)與“$”(行尾)。在上面的示例中,如果想要查詢以數字爲行首的行,則可以通過“”元字符來實現。

在這裏插入圖片描述

如果想要查詢以" . "爲行末的行,則可以通過“$”元字符來實現。

在這裏插入圖片描述

如果想要顯示空行,可使用 ‘^$’ 組合

在這裏插入圖片描述

如果需要過濾不顯示空行,則可以使用 ‘ [ ^$ ] ’ 組合。^在[ ] 裏面則代表反向

在這裏插入圖片描述

  • 查找任意一個字符 “ . ” 與重複字符 “ * “

在正則表達式中小數點(.)也是一個元字符,代表任意一個字符。例如, 執行以下命令就可以查找“w。。d”的字符串,即共有四個字符,以 w 開頭 d 結尾

在這裏插入圖片描述

“ * ”代表的是重複零個或多個前面的單字符。“o* ”表示擁有零個(即爲空字符)或大於等於一個“o”的字符,因爲允許空字符,所以執行“ grep –n ‘ wo* d ’ yum.conf ”命令會將文本中所有的內容都輸出打印。如果是 “ woo* d ”, 則第一個 o 必須存在,第二個 o 則是零個或多個 o,所以凡是包含 o、oo、ooo、ooo,等的資料都符合標準。同理,若查詢包含至少兩個 o 以上的字符串,則執行“grep –n ‘wooo* d’ yum.conf ”命令即可。

例如:

在這裏插入圖片描述

插敘以w開頭d結尾,中間的字符可以包含符號,空格等的字符串

在這裏插入圖片描述

  • 查找連續字符範圍 ”{ }“

    使用“.”與“*”來設定零個到無限多個重複的字符,如果想要查找三到五個 o 的連續字符,可以使用限定範圍的字符“{}”。因爲“{}”在 Shell 中具有特殊 意義,所以在使用“{}”字符時,需要利用轉義字符“\”,將“{}”字符轉換成普通字符。 “{}”字符的使用方法如下所示 \ { \ }

    • 查詢兩個o的字符

在這裏插入圖片描述

  • 查詢以 w 開頭以 d 結尾,中間包含 2~5 個 o 的字符串

在這裏插入圖片描述

  • 查詢以 w 開頭以 d 結尾,中間包含 2 以上 o 的字符串

在這裏插入圖片描述

元字符總結

基礎正則表達式常見元字符:

元字符 作用
^ 匹配輸入字符串的開始位置。除非在方括號表達式中使用,表示不包含該字符集合。要匹配“^”
$ 字符本身,請使用“^”匹配輸入字符串的結尾位置。如果設置了 RegExp 對象的 Multiline 屬性,則“KaTeX parse error: Undefined control sequence: \n at position 6: ”也匹配‘\̲n̲’或‘\r’。要匹配“”字符本身,請使用“$”
. 匹配除“\r\n”之外的任何單個字符
\ 將下一個字符標記爲特殊字符、原義字符、向後引用、八進制轉義符。例如,‘n’匹配字符“n”。 ‘\n’匹配換行符。序列‘\’匹配“\”,而‘(’則匹配“(”
* 匹配前面的子表達式零次或多次。要匹配“*”字符,請使用“*”
[] 字符集合。匹配所包含的任意一個字符。例如,“[abc]”可以匹配“plain”中的“a”
[^] 賦值字符集合。匹配未包含的一個任意字符。例如,“[^abc]”可以匹配“plain”中“plin”中的任何一個字母
[n1-n2] 字符範圍。匹配指定範圍內的任意一個字符。例如,“[a-z]”可以匹配“a”到“z”範圍內的任意一個小寫字母字符。注意:只有連字符(-)在字符組內部,並且出現在兩個字符之間時,才能表示字符的範圍;如果出現在字符組的開頭,則只能表示連字符本身
{n} n 是一個非負整數,匹配確定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個 o
{n,} n 是一個非負整數,至少匹配 n 次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有 o。“o{1,}”等價於“o+”。“o{0,}”則等價於“o*”
{n,m} m 和n 均爲非負整數,其中 n<=m,最少匹配 n 次且最多匹配 m 次

二、擴展正則表達式

grep 命令僅支持基礎正則表達式,如果使用擴展正則表達式,需要使用 egrep 或 awk 命令。這裏我們直接使用 egrep 命令。egrep 命令與 grep 命令的用法基本相似。egrep 命令是一個搜索文件獲得模式,使用該命令可以搜索文件中的任意字符串和符號,也可以搜索一個或多個文件的字符串,一個提示符可以是單個字符、一個字符串、一個字或一個句子。與基礎正則表達式類型相同,擴展正則表達式也包含多個元字符。

擴展正則表達式常見元字符:

元字符 作用
+ 匹配前面的子表達式1次以上,如:go+d,將匹配至少一個o
示例:執行“egrep -n ‘wo+d’ test.txt”命令,即可查詢"wood" “woood” "woooooood"等字符串
匹配前面的子表達式0次或者1次,如go?d,將匹配gd或者god
| 以或的方式匹配字符串,如:good|great,將匹配good或者great 字符串
() 作用:查找“組”字符串;將()中的字符串作爲一個整體
示例:“egrep -n ‘t(a|e)st’ test.txt”。“tast”與“test”因爲這兩個單詞的“t”與“st”是重複的,所以將“a”與“e”列於“()”符號當中,並以“|”分隔,即可查詢"tast"或者"test"字符串
()+ 作用:辨別多個重複的組,如(xyz)+,將匹配xyz整體一次及以上
示例:“egrep -n ‘A(xyz)+C’ test.txt”。該命令是查詢開頭的“A”結尾是“C”,中間有一個以上的“xyz”字符串的意思
  • egrep -n ‘wo+d’ yum.conf //查詢"wood" “woood” "woooooood"等字符串

在這裏插入圖片描述

  • egrep -n ‘wo?d’ yum.conf //匹配前面的子表達式0次或者1次,如wo?d,將匹配wd或者wod

在這裏插入圖片描述

  • egrep -n waad|wood’’ yum.conf //以或的方式匹配字符串

在這裏插入圖片描述

  • egrep -n ‘w(a|o)d’ yum.conf // 兩個單詞的“w”與“d”是重複的,所以將“a”與“o”列於“()”符號當中,並以“|”分隔,即可查詢"wad"或者"wod"字符串

在這裏插入圖片描述

  • egrep -n ‘A(xyz)+C’ yum.conf //辨別多個重複的組,如(xyz)+,將匹配xyz整體一次及以上

在這裏插入圖片描述

三、sed工具

sed(Stream EDitor)是一個強大而簡單的文本解析轉換工具,可以讀取文本,並根據指定的條件對文本內容進行編輯(刪除、替換、添加、移動等),最後輸出所有行或者僅輸出處理的某些行。sed 也可以在無交互的情況下實現相當複雜的文本處理操作,被廣泛應用於 Shell 腳本中,用以完成各種自動化處理任務。

sed 的工作流程主要包括讀取、執行和顯示三個過程。

  • 讀取:sed 從輸入流(文件、管道、標準輸入)中讀取一行內容並存儲到臨時的緩衝區中(又稱模式空間,pattern space)。

  • 執行:默認情況下,所有的 sed 命令都在模式空間中順序地執行,除非指定了行的地址,否則 sed 命令將會在所有的行上依次執行。

  • 顯示:發送修改後的內容到輸出流。再發送數據後,模式空間將會被清空。在所有的文件內容都被處理完成之前,上述過程將重複執行,直至所有內容被處理完。

注意:默認情況下,所有的 sed 命令都是在模式空間內執行的,因此輸入的文件並不會發生任何變化,除非是用重定向存儲輸出。

sed 命令常見用法:

通常情況下調用 sed 命令有兩種格式,“參數”是指操作的目標文件,當存在多個操作對象時用,文件之間用逗號“,”分隔;而 scriptfile 表示腳本文件,需要用“-f”選項指定,當腳本文件出現在目標文件之前時,表示通過指定的腳本文件來處理輸入的目標文件

sed[選項] '操作' 參數

sed [選項] -f scriptfile 參數

常見的 sed 命令選項主要包含以下幾種:

  • -e 或–expression=:表示用指定命令或者腳本來處理輸入的文本文件

  • -f 或–file=:表示用指定的腳本文件來處理輸入的文本文件

  • -h 或–help:顯示幫助

  • -n、–quiet 或 silent:表示僅顯示處理後的結果

  • -i:直接編輯文本文件 -i 直接編輯的時源文件,更改後不可逆,要注意

“操作”用於指定對文件操作的動作行爲,也就是 sed 的命令。通常情況下是採用的“[n1[,n2]]”操作參數的格式。n1、n2 是可選的,不一定會存在,代表選擇進行操作的行數,如操作需要在 5~20 行之間進行,則表示爲“5,20 動作行爲”。

常見的操作包括以下幾種:

  • a:追加,在當前行下面增加一行指定內容。
  • d:刪除,刪除選定的行。
  • i:插入,在選定行上面插入一行指定內容。
  • p:打印,如果同時指定行,表示打印指定行;如果不指定行,則表示打印所有內容;如果有非打印字符,則以 ASCII 碼輸出。其通常與“-n”選項一起使用。
  • c:替換,將選定行替換爲指定內容。
  • s:替換,替換指定字符。
  • y:字符轉換。
  • r:讀取指定文件
  • w:保存爲文件
  • g:代表只要符合條件,全部都進行處理

c 替換行 ,s 替換字符,使用 s替換居多

用法示例:
1、輸出符合條件的文本(p表示正常輸出)
  • 輸出所有內容,等同於cat yum.conf : sed -n ‘p’ yum.conf

在這裏插入圖片描述

  • 輸出第3行 : sed -n ‘3p’ yum.conf

在這裏插入圖片描述

  • 輸出3-5行: sed -n ‘3,5p’ yum.conf

在這裏插入圖片描述

  • 輸出所有奇數行,n表示讀入下一行資料:sed -n ‘p;n’ yum.conf

在這裏插入圖片描述

  • 輸出所有偶數行,n表示讀入下一行資料: sed -n ‘n;p’ yum.conf

在這裏插入圖片描述

  • 輸出2-6行之間的奇數行:sed -n ‘2,6{p;n}’ yum.conf

在這裏插入圖片描述

  • 輸出2-6行之間的偶數行: sed -n ‘2,6{n;p}’ yum.conf

在這裏插入圖片描述

’ p;n ‘ 先p 打印第一行; no 不打印第二行 打印奇數行

’ n;p ‘ no 不打印第一行; p 打印第二行 打印偶數行

奇/偶數打印是相對的,按照規定的範圍來進行打印,例如:打印2-6行的偶數行,讀取第一行是文件的第2行,所以2行屬於奇數行,不打印,讀取第二行時文件的3行,屬於偶數行,以此類推打印。

n和p是一個組合,執行了n,p也是會執行

  • 輸出第6行至文件末尾之間的偶數行:sed -n ‘6,${n;p}’ yum.conf

在這裏插入圖片描述

sed 命令結合正則表達式時,格式略有不同,正則表達式以“/”包圍。

示例:

  • 輸出包含the的行: sed -n ‘/the/p’ yum.conf

在這裏插入圖片描述

  • 輸出從第4行至第一個包含the 的行: sed -n ‘7,/the/p’ yum.conf

在這裏插入圖片描述

  • 輸出包含the的行所在的行號,等號(=)用來輸出行號 (只獲取行號)

    sed -n ‘/the/=’ yum.conf

在這裏插入圖片描述

  • 輸出以w開頭的行 : sed -n ‘/^w/p’ yum.conf

在這裏插入圖片描述

  • 輸出以數字結尾的行 : sed -n ‘/[0-9]$/p’ yum.conf

在這裏插入圖片描述

  • 輸出包含單次wood的行,\ < 。。 \ > 代表單詞邊界

    sed -n ‘/<wood>/p’ yum.conf

在這裏插入圖片描述

2、刪除符合條件的文本(d)

nl命令用於計算文件的行數

  • 刪除第3行 : nl yum.conf | sed ‘3d’

在這裏插入圖片描述

  • 刪除第3-5行 : nl yum.conf | sed ‘3,5d’

在這裏插入圖片描述

  • 刪除包含main的行,原本的第一行被刪除 : nl yum.conf | sed ‘/main/d’

在這裏插入圖片描述

  • 刪除不包含main的行: nl yum.conf | sed ‘/main/!d’

在這裏插入圖片描述

  • 刪除以數字爲開頭的行 : sed ‘/^ [0-9]/d’ yum.conf

    刪除以小寫字母爲開頭的行: sed ‘/^ [a-z]/d’ yum.conf

在這裏插入圖片描述

  • 刪除以 “ . ” 結尾的行 : sed ‘/ \ .$/d’ yum.conf

在這裏插入圖片描述

  • 刪除所有空行 : sed ‘/^$/d’ yum.conf

    注意:若是刪除重複的空行,即連續的空行只保留一個, 執行“ sed –e ‘/^KaTeX parse error: Expected group after '^' at position 6: /{n;/^̲/d}’ yum.conf”命令即可實現。其效果與“cat -s yum.conf”相同,n 表示讀下一行數據

在這裏插入圖片描述

  • 將包含數字的行另存爲文件 num.txt

    sed ‘/[0-9]/w num.txt’ yum.conf

在這裏插入圖片描述

在這裏插入圖片描述

3、替換符合條件的文本

使用 sed 命令進行替換操作時需要用到 s(字符串替換)、c(整行/整塊替換)、y(字符轉換)命令選項

  • sed ‘s/the/THE/’ yum.conf //將每行中的第一個the 替換爲 THE

在這裏插入圖片描述

  • sed ‘s/l/L/2’ yum.conf //將每行中的第 2 個l 替換爲L

在這裏插入圖片描述

  • sed ‘s/the/THE/g’ yum.conf //將文件中的所有the 替換爲THE

    在這裏插入圖片描述

  • sed ‘s/o//g’ yum.conf //將文件中的所有o 刪除(替換爲空串)

在這裏插入圖片描述

  • sed ‘s/^/#/’ yum.conf //在每行行首插入#號

在這裏插入圖片描述

  • sed ‘/the/s/^/#/’ yum.conf //在包含the 的每行行首插入#號

在這裏插入圖片描述

  • sed ‘s/$/EOF/’ yum.conf //在每行行尾插入字符串EOF

在這裏插入圖片描述

  • sed ‘3,9s/the/THE/g’ yum.conf //將第 3~9 行中的所有the 替換爲 THE

在這裏插入圖片描述

  • sed ‘/the/s/o/O/g’ yum.conf //將包含the 的所有行中的o 都替換爲 O

在這裏插入圖片描述

4、遷移(剪切)符合條件的文本

H : 複製到剪貼板;

g、G : 將剪貼板中的數據覆蓋/追加至指定行;

w : 保存爲文件;

r : 讀取指定文件;

a : 追加指定內容

  • sed ‘/the/{H;d};$G’ yum.conf //將包含the 的行遷移至文件末尾,{;}用於多個操作

在這裏插入圖片描述
在這裏插入圖片描述

  • sed ‘1,3{H;d};10G’ yum.conf //將第 1~3 行內容轉移至第 10 行後

在這裏插入圖片描述

  • sed ‘/[0-9]/w num.txt’ yum.conf //將包含數字的行另存爲文件num.txt

在這裏插入圖片描述

在這裏插入圖片描述

  • sed ‘/the/r /opt/111’ yum.conf //將文件/opt/111 的內容添加到包含the 的每行以後

在這裏插入圖片描述

  • sed ‘3aNew’ yum.conf //在第 3 行後插入一個新行,內容爲 New

在這裏插入圖片描述

  • sed ‘/the/aNew’ yum.conf //在包含the 的每行後插入一個新行,內容爲 New

在這裏插入圖片描述

  • sed ‘3aNew1\nNew2’ yum.conf //在第 3 行後插入多行內容,中間的\n 表示換行
  • sed ‘$aNew1\nNew2’ yum.conf //在文本末行後插入多行

在這裏插入圖片描述

5、使用腳本編輯文件

使用 sed 腳本,將多個編輯指令存放到文件中(每行一條編輯指令),通過“-f”選項來調用

  • sed ‘1,3{H;d};10G’ test.txt //將第 1~3 行內容轉移至第 10 行後

在這裏插入圖片描述

發佈了69 篇原創文章 · 獲贊 43 · 訪問量 8815
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章