正則三劍客grep、sed、awk

正則

  • 正則就是一串有規律的字符串,掌握好正則對於編寫shell腳本有很大幫助,各類編程語言中都有正則,原理是同樣的
  • 正則三劍客
    • grep
    • sed
    • awk

 grep

grep用法:grep [參數] '關鍵字' 文件名    #關鍵詞也能夠是正則表達式
grep [-cinvABC] 'word' filename 
-c 統計包含'關鍵字'的行數。既使一行有多個關鍵字,也會按一行計算。
-i 篩選'關鍵字'時不區分大小寫。
-n 篩選'關鍵字'時顯示關鍵字所在的行號。
-v 反向選擇,也就是'關鍵字'之外的內容。
-r 查詢關鍵詞時遍歷路徑下的子目錄。
-An 這裏的n是一個數字。做用是過濾出符合要求的行以及下面的「n」行。
-Bn 同上,區別爲符合要求的行以及上面的「n」行。
-Cn 同上,區別爲符合要求的行以及上下的各「n」行。
 grep -n 'root' /etc/passwd   #顯示出現root的行數
 grep -nv 'nologin' /etc/passwd    #不顯示出現root的行數
 grep '[0-9]'/etc/inittab       #顯示 /etc/inittab文件下出現0-9關鍵詞的行數
 grep -v '[0-9]'/etc/inittab    #顯示 /etc/inittab文件下出現0-9關鍵詞以外的行數
 grep -v '^#' /etc/inittab      #^符號表示開頭,#符號表示結尾。此處爲顯示/etc/inittab內容中不帶空行的內容
 grep -v '^#' /etc/inittab|grep -v  '^$'    
 grep '^[^a-zA-Z]' test.txt
 grep 'r.o' test.txt
 grep 'oo*' test.txt
 grep '.*' test.txt
 grep 'o\{2\}' /etc/passwd
 egrep 'o{2}' /etc/passwd
 egrep 'o+' /etc/passwd
 egrep 'oo?' /etc/passwd
 egrep 'root|nologin' /etc/passwd
 egrep '(oo){2}' /etc/passwd

參數-E以及egrep

egrep == grep -E

egrep能夠在'關鍵字'中使用擴展正則表達式中的字符。 擴展正則表達式字符:
# 井號
| 豎線
() 小括號
+ 加號
? 問號
{} 花括號正則表達式

正則表達式

[] 方括號表示一個範圍,能夠是括號內的任意一個字符。
[a-z] 全部的小寫字母
[A-Z] 全部的大寫字母
[a-zA-z] 全部的字母
[0-9] 全部的數字。
^ 即爲shift+6。表示以什麼什麼開頭。例如'^#'即爲以#號開頭。
$ 即爲shift+4。表示以什麼什麼結尾。例如'g$'即爲以g結尾。
^$ 用來表示一個空行。就是開頭至結尾中間啥也沒有。
. 表示任意一個字符。
* 表示匹配星號左邊的字符0次或屢次。
+ 表示匹配加號左邊的字符一次或屢次。
? 表示匹配問號左邊的字符零次或兩次。
{n} 其中n爲數字或是範圍。當內容是範圍時用逗號分隔。表示匹配花括號左邊的一個字符n次。
() 小括號中的內容被視爲一個總體。
.* 表示任意個字符shell

sed

格式:sed 命令參數 '動做範圍'參數 文件或路徑

sed 命令參數

-n 只顯示匹配的行。
-e 執行多個匹配條件。
-r 使用擴展正則表達式字符。等同於grep -E和egrep的關係。
-i 執行結果直接寫入文件。編程

sed動做範圍參數

p 顯示全部內容。因爲p會顯示全部內容,因此通常有p的場和都加-n。
d 顯示動做範圍之外的內容。
I 大寫的I表示內容不區分大小寫。編程語言

sed的查找替換功能

sed 命令中單引號中間的內容可使用相似vi命令中的查找替換。
普通查找替換: 's/源內容/替換內容/g'post

查找替換的內容裏包含「/」分界符的處理方案

1,在「/」的前面加「\」脫義符。使它成爲字符而不是命令。
2,使用「#」或「@」代替「/」的分界符功能。注間,這裏是代替分界符而不是查找替換內容中的「/」。spa

查找替換的其餘使用方法

1,刪除指定內容。
能夠在源內容裏使用[]來指定範圍。好比[1-9]爲數字,[a-z]是小寫字母。
在[]內使用「^」也就是shift+6符號。是反向選擇的意思。好比[^1-9]就是數字之外所有的意思。
2,替換內容中的&符號。能夠表明源內容的每一行。
例:sed 's/.*/1234&/' test
就是在每一行的開頭加1234。反之就是在未尾加。.net

對文件內容順序調換的方法:code

1,分段:
第一段 ([^:]+)#^:表示冒號以外的字符
表示開頭至一個或多個非冒號的字符。
第二段 (:.:)
表示冒號開頭,和冒號結尾的內容。
第三段 ([^:]+)
表示非冒號的一個或多個字符而後結尾。
blog


2,調換位置
使用\反斜槓加數字表示分段,而後從新排序。
sed -r 's/([^:]+)(:.
:)([^:]+)/\3\2\1/' test排序

awk

5.45 awk

格式:

awk -F '分割符' '動做' 文件名

例: awk -F ':' '' test |awk -F ':' '{print $1}'
5-90.png
以上就是以冒號爲分割符,輸出第1段的內容。
5-91.png
$一、$二、$3分別表示第一段、第二段、第三段。而$0表示整行。

自定義輸出結果的分割符'{OFS="#"}'

5-92.png
注意,這個選項對$0無效。
5-93.png
手動變動分割符

條件匹配

awk -F ':' '$1 ~/oo/' test

5-94.png

多條件匹配

awk -F ':' '/root/ {print $1,$3} /test/ {print$1,$3,$4}' test

5-95.png

匹配條件爲邏輯判斷

[root@localhost tmp]# awk -F ':' '$3 == 0' test

5-96.png
數字邏輯運算
爲數字加雙引號,將會把他的屬性變動爲字符串型。
5-97.png
取反選擇
5-98.png

多條件判斷

5-99.png
&&鏈接表示而且

在有{OFS="#"}的狀況下添加篩選條件

awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd

5-100.png

內置變量NF 與NR

5-101.png
$NF與$NR表示段數量和行數量。

變動某一段的輸出值

awk -F ':' '$1="aaa"' test

5-102.png
變動某一段的輸出值,能夠和{OFS="#"}放在同一個單引號裏。

統計某一段的值

awk -F ':' '{(sum=sum+$3)}; END {print sum}' /etc/passwd 

awk的完整形式: awk -F ':' 'BEGIN {}; {條件}; END{}' filename 其中BEGIN和END均可以省略。中間的條件是依次執行文件中的每一行。 好比這個{(sum=sum+$3)}.    #或者sum+=¥3 他就會執行這個文件的NR(行數)的統計。

相關文章
相關標籤/搜索