Linux正則表達式解析及課後習題解答----工坊學習記錄--5.1

一、正則表達式

 

1. grep/egrep 工具的使用

該命令的格式爲:grep [-cinvABC]‘ word' filename,其常用的選項如下所示。

  • -c:表示打印符合要求的行數。
  • -i:表示忽略大小寫。
  • -n:表示輸出符合要求的行及其行號。
  • -v:表示打印不符合要求的行。
  • -A:後面跟一個數字(有無空格都可以),例如-A2表示打印符合要求的行以及下面兩行。
  • -B:後面跟一個數字,例如-B2表示打印符合要求的行以及上面兩行。
  • -C:後面跟一個數字,例如-C2表示打印符合要求的行以及上下各兩行。
     
    首先看看-A、-B和-C這3個選項的用法。
  • -A2會把包含halt的行以及這行下面的兩行都打印出來:
    在這裏插入圖片描述
  • -B2會把包含halt的行以及這行上面的兩行都打印出來:
    在這裏插入圖片描述
  • -C2會把包含halt的行以及這行上下各兩行都打印出來:

在這裏插入圖片描述
 

1.1 過濾出帶有某個關鍵詞的行,並輸出行號

示例:
在這裏插入圖片描述
 

1.2 過濾出不帶有某個關鍵詞的行,並輸出行號

示例:

 

1.3 過濾出所有包含數字的行

示例:

 

1.4 過濾出所有不包含數字的行

示例:
在這裏插入圖片描述
 

1.5 過濾掉所有以#開頭的行

示例:
在這裏插入圖片描述
 

1.6 過濾掉所有空行和#開頭的行

示例:
在這裏插入圖片描述
在正則表達式中,^表示行的開始,$ 表示行的結尾,那麼空行則可以用^$表示。如何打印出不以英文字母開頭的行呢?我們先來自定義一個文件,如下所示:
在這裏插入圖片描述
 

1.7 過濾出任意一個字符和重複字符

示例:
在這裏插入圖片描述
. 表示任意一個字符。上例中,r.o 表示把 r 與 o 之間有一個任意字符的行過濾出來。
在這裏插入圖片描述
*表示零個或多個 * 前面的字符。上例中,ooo*表示oo、ooo、oooo.. 或者更多的o
在這裏插入圖片描述
上例中,. *表示零個或多個任意字符,空行也包含在內,它會把/etc/passwd文件裏面的所有行都匹配到。

 

1.8 指定要過濾出的字符出現次數

示例:
在這裏插入圖片描述
這裏用到了符號{ },其內部爲數字,表示前面的字符要重複的次數。需要強調的是,{ }左右都需要加上轉義字符\。另外,使用“{ }”還可以表示一個範圍,具體格式爲{n1,n2},其中n1<n2,表示重複n1到n2次前面的字符,n2還可以爲空,這時表示大於等於n1次。
 

1.9 過濾出一個或多個指定的字符

示例:
在這裏插入圖片描述
在這裏插入圖片描述
和grep不同,這裏egrep使用的是符號+,它表示匹配1個或多個 + 前面的字符,這個“+”是不支持被grep直接使用的。包括上面的{ } ,也是可以直接被egrep使用,而不用加\轉義。示例如下:
在這裏插入圖片描述
 

1.10 過濾出零個或一個指定的字符

示例:
在這裏插入圖片描述
 

1.11 過濾出字符串 1 或字符串2

示例:
在這裏插入圖片描述
 

1.12 egrep中()的應用

示例:
在這裏插入圖片描述
這裏用()表示一個整體,上例中會把包含rooo或者rato的行過濾出來,另外也可以把()和其他符號組合在一起,例如(oo)+就表示1個或者多個oo。如下所示:
在這裏插入圖片描述
 

2. sed工具的使用

 

2.1 打印某行

sed命令的格式爲:sed -n 'n'p filename,單引號內的n是一個數字,表示第幾行。-n選項的作用是隻顯示我們要打印的行,無關緊要的內容不顯示。示例命令如下:
在這裏插入圖片描述
可以去掉 -n 選項對比一下差異。要想把所有行都打印出來,可以使用命令sed -n '1,$'p filename,如下所示:
在這裏插入圖片描述
也可以指定一個區間打印,如下所示:
在這裏插入圖片描述
 

2.2 打印包含某個字符的行

示例:
在這裏插入圖片描述
這種用法就類似於grep了,在grep中使用的特殊字符(如^、$、.、*等)同樣也能在sed中使用,如下所示:
在這裏插入圖片描述
sed命令加上 -e 選項可以實現多個行爲,如下所示:
在這裏插入圖片描述
 

2.3 刪除某些行

示例:
在這裏插入圖片描述
這裏參數d表示刪除的動作,它不僅可以刪除指定的單行以及多行,而且可以刪除匹配某個字符的行,還可以刪除從某一行開始到文檔最後一行的所有行。不過,這個操作僅僅是在顯示器屏幕上並不顯示這些行而已,文檔還好好的!
 

2.4 替換字符或者字符串

示例:
在這裏插入圖片描述
上例中的參數s就表示替換的動作,參數g表示本行全局替換,如果不加g則只替換本行出現的第一個,這個用法其實和vim的替換大同小異。
除了可以使用/作爲分隔符外,我們還可以使用其他特殊字符,例如#和@。如下所示:
在這裏插入圖片描述
刪除文檔中所有的數字或者字母。示例命令如下:
在這裏插入圖片描述
[0-9]表示任意的數字。這裏你也可以寫成[a-zA-Z]或者[0-9a-zA-Z]。如下所示:
在這裏插入圖片描述
 

2.5 調換兩個字符串的位置

示例:
在這裏插入圖片描述
小括號在sed中屬於特殊符號,必須在前面加轉義字符\,替換時則寫成類似\1、\2 或\3的形式。
上例中用()把想要替換的字符打包成了一個整體。有這個轉義字符\,會讓這個表達式看起來亂糟糟的,有個方法可以省略它。如下所示:

在這裏插入圖片描述
這個 -r 選項讓這個表達式更加清晰了。除了調換兩個字符串的位置,用 sed 在某一行前後增加指定內容,如下所示:
在這裏插入圖片描述
 

2.6 直接修改文件的內容

示例:
在這裏插入圖片描述
 

3. awk 工具的使用

 

3.1 截取文檔中的某個段

示例:
在這裏插入圖片描述
本例中,-F選項的作用是指定分隔符。如果不加-F選項,則以空格或者tab爲分隔符。print爲打印的動作,用來打印某個字段。$1爲第1個字段,$2爲第2個字段,以此類推。但 $0比較特殊,它表示整行:
在這裏插入圖片描述
注意awk 的格式,-F後面緊跟單引號,單引號裏面爲分隔符。print的動作要用{ }括起來,否則會報錯。print還可以打印自定義的內容,但是自定義的內容要用雙引號括起來,如下所示:
在這裏插入圖片描述
 

3.2 匹配字符或者字符串

示例:
在這裏插入圖片描述
這跟sed的用法類似,能實現grep的功能,但沒有顏色顯示,肯定沒有grep用起來方便。不過awk還有比sed更強大的匹配,如下所示:
在這裏插入圖片描述
它可以讓某個段去匹配,這裏的一就是匹配的意思。awk還可以多次匹配,如下所示:
在這裏插入圖片描述
本例中 awk 匹配完 root,再匹配 test,它還可以只打印所匹配的段。
 

3.3 條件操作符

示例:
在這裏插入圖片描述
awk中可以用邏輯符號進行判斷,比如==就是等於,也可以理解爲精確匹配。另外還有>、>=、<、<=、!= 等。值得注意的是,在和數字比較時,若把比較的數字用雙引號引起來,那麼awk不會認爲是數字,而會認爲是字符,不加雙引號則會認爲是數字:
在這裏插入圖片描述
本例中,本想把uid大於等於500的行打印出來,但是結果並不理想。這是因爲awk把所有的數字當作字符了,就跟上一章中提到的sort排序原理一樣。但,不加雙引號就得到了想要的結果:
在這裏插入圖片描述
本例中,!=表示不匹配,它除了針對某一個段的字符進行邏輯比較外,還可以在兩個段之間進行邏輯比較。如下所示:
在這裏插入圖片描述
另外還可以使用&&和 | |,它們分別表示“並且”和“或者”。&&的用法如下:
在這裏插入圖片描述
 

3.4 awk 的內置變量

awk常用的變量有OFS、NF和NR,OFS和-F選項有類似的功能,也是用來定義分隔符的,但是它是在輸出的時候定義,NF表示用分隔符分隔後一共有多少段,NR表示行號。
OFS的用法示例:
在這裏插入圖片描述
變量NF的具體用法:
在這裏插入圖片描述
這裏NF是多少段,NF是最後一段的值。變量NR的具體用法如下:
在這裏插入圖片描述
還可以使用NR作爲判斷條件,如下所示, NR:是指到目前爲止的記錄數目
在這裏插入圖片描述
NR也可以配合段匹配一起使用,如下所示:
在這裏插入圖片描述
 

3.5 awk 中的數學運算

awk可以更改段值,示例:
在這裏插入圖片描述
awk也可以對各個段的值進行數學運算,示例:
在這裏插入圖片描述
awk還可以計算某個段的總和,示例:
在這裏插入圖片描述
這裏的END是ak特有的語法,表示所有的行都已經執行。其實 awk 連同 sed 都可以寫成一個腳本文件,而且有它們特有的語法。在awk中使用 i f判斷、for循環都可以,如下所示:

在這裏插入圖片描述
 
 

二、課後習題

(1)如何把 /etc/passwd 中用戶 uid 大於 500的行打印出來?
答:
在這裏插入圖片描述

(2)awk中變量 NR和 NF分別表示什麼含義?命令awk -F ':' '{print $NR}' /etc/passwd會打印出什麼結果?
答:NR表示行數,NF表示一共有多少段;如圖:
在這裏插入圖片描述

(3)用grep把1.txt文檔中包含abc或者123的行過濾出來,並在過濾出來的行前面加上行號。
答:
在這裏插入圖片描述

(4)命令grep -v '^$' 1.txt會過濾出哪些行?
答:會過濾出不是空的行,如圖:
在這裏插入圖片描述

(5)符號.、.* 和 *分別表示什麼含義?符號+和?表示什麼含義?這5個符號是否可以在grep、egrep、sed 以及awk中使用?
答:
'.' 表示一個任意的字符;
'*' 表示前面緊鄰的那個字符有零個或多個,即前面緊鄰的那個字符可以不存在,也可以有多個;
'.*' 表示零個或多個的任意字符,包括空行;
'+' 表示前面緊鄰的那個字符有一個或多個;
'?' 表示前面緊鄰的那個字符有零個或一個;
grep和sed可以使用'.' 、 '*' 和 '.*',但是不能使用'+'和'?' egrep和awk全部可以使用。

(6)grep裏面的符號{ }用在什麼情況下?
答:{ },其內部爲數字,表示前面的字符要重複的次數。數字可以是單個數字{n},也可以是一個區間{n1,n2}。在字符串中,{ }左右都需要加上脫意字符 ‘\’。

(7)sed有一個選項可以直接更改文本文件,是哪個選項?
答: -i 選項

(8)sed -i 's/.* ie//;s/["I&].*//' file這條命令表示什麼操作呢?
答:表示把file中出現的以ie結尾的字符串刪除;把file中以"或|或&開頭的字符串刪除

(9)如何刪除一個文檔中的所有數字或者字母?
答:

  1. 刪除所有數字: sed -i ‘s/[0-9]//g’ file
  2. 刪除所有字母: sed -i ‘s/[a-Z]//g’ file
    如圖:
    在這裏插入圖片描述

(10)截取日誌1.log的第1個字段(以空格爲分隔符),按數字排序,然後去重,但是需要保留重複的數量,如何做?
答:
在這裏插入圖片描述

(11)使用awk過濾出1.log中第7個字段(以空格爲分隔符)爲200並且第8個字段爲11897的行。
答:
在這裏插入圖片描述

(12)請比較這兩個命令的異同:grep -v '^[o-9]' 1.txt 和 grep '^[0-9]'1.txt。
答:

第一個是:以數字開頭的行匹配出來,輸出打印剩餘的行,包括空行。
第二個是:以非數字開頭的行匹配出來並輸出打印,不包括空行。

(13)awk中的$0表示什麼?爲什麼以下兩條命令的$0結果不一致呢?
awk -F ':' '{print $o}' 1.txt
awk -F ':' ‘$7=1 {print $o}' 1.txt

答:$0 表示整行;

  1. awk -F ‘:’ ‘{print $0}’ 1.txt //打印所有的行 ,即整個記錄
  2. awk -F ‘:’ ‘$7=1 {print $0}’ 1.txt //以冒號爲分隔符,輸出時將每行的第七段的內容更改爲1,並打印所有的行,此時並不會連帶分隔符一起輸出

(14)使用grep過濾某個關鍵詞時,如何把包含關鍵詞的行連同上面一行打印出來?連同下面一行也打印呢?同時打印上下各一行呢?
答:如圖:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章