前言
在Linux的學習和使用當中,人們常常提到的三劍客其實指的是grep、sed、awk這三個命令的簡稱,當熟練掌握了這幾個命令,可以極大的提升運維效率。在講到這三個命令之前,我們得先了解什么是正則表達式,正則表達式是學習三劍客的基礎和前提。
一、正則表達式
正則表達式:Regular Expression,描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出復核某個條件的子串等。
標准正則表達式:
元字符:
. 匹配任意單個字符
[] 匹配指定范圍內的任意單個字符
[^] 匹配指定范圍外的任意單個字符
字符集合:
[:alnum:] 代表英文大小寫字符及數字,亦即 0~9、A~Z、a~z
[:alpha:] 代表任何英文大小寫字符,亦即 A~Z、a~z
[:blank:] 代表空格鍵與[tab]按鍵兩者
[:cntrl:] 代表鍵盤上面的控制按鍵,包括CR、LF、Tab、Del等
[:digit:] 代表數字而已,即 0~9
[:graph:] 除了空格符(空格鍵與[tab]按鍵)外的其他所有按鍵
[:lower:] 代表小寫字符,即 a~z
[:print:] 代表任何可以被打印出來的字符
[:punct:] 代表標點符號(punctuation symbol),亦即 : " ' ? ! ; : # $
[:upper:] 代表大寫字符,即 A~Z
[:space:] 代表會產生空白的字符,包括空格鍵、[tab]、CR等
[:xdigit:] 代表十六進制的數字類型,因此包括 0~9、A~F、a~f 的數字與字符
匹配次數(貪婪模式):
* 匹配其前面的字符任意次
? 匹配其前面的字符0次或者1次
+ 匹配其前面的字符至少1次
.* 任意長度的任意字符
位置錨定:
^ 錨定行首,此字符后面的任意內容必須出現在行首
$ 錨定行尾,此字符后面的任意內容必須出現在行尾
^$ 空白行
因為在Linux系統中shell解釋器的特殊處理,某些元字符在linux下具有展開式等特殊含義,在實際使用過程中,我們需要添加 / 對其進行轉義。
\? :匹配其前面的字符1次或0次;
\+ : 匹配至少1次;
\{m,n\} :匹配其前面的字符至少m次,至多n次;
\{1,\} :匹配前面的字符至少1次;
\{0,3\} :匹配前面的字符0次至3次均可;
備注:至少0次,必須要顯示的寫出來
\< 或者 \b :錨定詞首,其后面的任意字符必須作為單詞首部出現
\> 或者 \b :錨定詞尾,其后面的任意字符必須作為單詞的尾部出現
擴展正則表達式:
字符匹配:
. 匹配單個字符
[abc] 包含abc任意一個字符
[^abc] 不包含abc任意一個字符
次數匹配(不用再轉義):
* 匹配前一個字符任意次
? 匹配其前面的字符1次或者0次
+ 匹配其前面的字符至少1次
{m,n} 匹配其前面的字符至少m次,至多n次
位置錨定:
\< 詞首
\> 詞尾
二、grep命令--擅長查找
grep命令家族有 grep、egrep、fgrep 三個子命令,適用於不通的場景,具體如下:
1.grep 原生的grep命令,使用“標准正則表達式”作為匹配標准
2.egrep 擴展的grep命令,相當於 $(grep -E) ,使用“擴展正則表達式”作為匹配標准
3.fgrep 簡化版的grep命令,不支持正則表達式,但搜索速度快,系統資源使用率低
基本語法:
grep [options] PATTERN [FILE...]
options部分
-i :忽略大小寫
--color=auto : 高亮匹配上的字符串
-n : 顯示匹配的行號
-c : 統計匹配的行數
-v : 顯示沒有被模式匹配到的行
-o : 只顯示被模式匹配到的字符串
-q : 靜默模式,不輸出任何信息
-A # :after,后#行
-B # :before,前#行
-C # :context,前后各#行
-e :實現多個選項間的邏輯or關系
-w :匹配整個單詞
-E : 使用擴展的正則表達式,egrep = grep -E
-F : 相當於fgrep,不支持正則表達式
PATTERN部分
以字符串的形式來給定匹配模板,可以使用普通字符串以及正則表達式(標准&擴展)
FILE部分
需要查找內容的文件
三、sed命令--擅長取行和替換
基本語法:
sed [option] 'script' [input file] ...
option部分
-n :不輸出模式空間中未匹配上的內容stdout到屏幕,即不自動打印
-e :可以在sed命令中指定多個script腳本,多點編輯功能
-f :輸入sed腳本,腳本中寫着編輯命令
-r :支持使用擴展的正則表達式
-i :直接編輯源文件
script部分
1.不給地址:對全文進行處理
2.單地址:
n:指定的第n行,$:最后一行
/pattern/:被此模式所能夠匹配到的每一行
3.地址范圍:
n,m :定位從第n行開始至第m行(都是閉區間)
n,+k :定位從第n行開始,包括往后的k行
n,/pattern/ :定位從第n行開始,至指定模式匹配到的那一行
/pattern1/,/pattern2/ :定位從 pattern1 模式匹配開始,直到 pattern2 模式匹配之間的范圍
4.步進方式:
1~2 :以1為起始行,然后步進2行向下匹配,即所有的奇數行
2~2 :以2為起始行,然后步進2行向下匹配,即所有的偶數行
5.編輯命令:
- d 刪除模式空間匹配的行,並立即啟用下一輪循環
- p 打印當前模式空間的內容,追加到默認輸出之后
- a [\] text 在指定行后面追加文本,支持使用\n實現多行追加
- i [\] text 在行前面插入文本
- c [\] text 替換行為單行或多行文本
- w /path/somefile 保存模式匹配的行至指定文件
- r /path/somefile 讀取指定文件的文本至模式空間中匹配到的行后
- = 為模式空間中的行打印行號
- !模式空間中匹配行取反處理
- s/// :查找替換,支持使用其他分隔符
- 替換標記: g -- 行內全局替換 p -- 顯示替換成功的行 w /path/ to somefile 將替換成功的行保存至文件中
四、awk命令--擅長取列
awk是一個報表生成器,主要用於格式化輸出。--格式化文本輸出器
語法:
awk [option] 'PATTERN{ACTION STATEMENTS}' FILE
awk是按照行來讀取文件的,根據輸入分隔符切分成小部分(用內建變量來表示 $0,$1,$2等),$0表示顯示整行
option選項
-F:指明輸入字段的分隔符
-v:用來實現自定義變量 var=value
PATTERN
``:表示處理文件的所有行。
/pattern/ :表示處理正則匹配對應的行。
!/pattern/ :表示處理正則不匹配的行。
關系表達式:比如返回布爾類型的表達式,若結果為真則處理,假則不處理。對於非0非空字符串為真,其余為假。
n:表示處理第n行的文本。
BEGIN/END模式:BEGIN{}表。示僅在開始處理文件中的文本之前執行一次的程序,例如打印表頭。END{}表示文本處理完成之后執行一次,例如匯總數據。
內建變量
FS:輸入字段分隔符,默認為空白字符。也可使用-v指定。
OFS:輸出字段分隔符。使用-v指定。
RS:輸入時的換行符
ORS:輸出時的換行符
NF:每一行的字段數量。加上$NF表示最后一列。
NR:文件的行數,打印出來是打印行號
FNR:多個文件中的行數分別計數
FILENAME:當前文件的文件名
ARGC:參數命令行中參數的個數
ARGV:返回數組,命令行中的每個參數
示例:awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/issue
此處ARGV[0] 是awk,固定為第0個參數。ARGV[1]是/etc/fstab,ARGV[2]是/etc/issue
awk -v FS=':' '{print $1}' -v OFS=':' /etc/passwd
指明冒號作為輸入及輸出的分隔符。同awk -F:...
自定義變量
方法1:-v var=value(區分字符的大小寫)
方法2:在program中定義
示例:awk -v test='hello' 'BEGIN {print test}'
awk 'BEGIN {test='hello' print test}'
五、擴展-格式化打印(printf)
語法:
printf [format] [文本1] [文本2] ..
常用格式替換符:
%s 字符串
%f 浮點格式
%c ASCII字符,即顯示對應參數的第一個字符
%d,%i 十進制整數
%o 八進制值
%u 不帶正負號的十進制值
%x 十六進制值(a-f)
%X 十六進制值(A-F)
%% 表示%本身
常用轉義字符:
\a 警告字符,通常為ASCII的BEL字符
\b 后退
\f 換頁
\n 換行
\r 回車
\t 水平制表符
\v 垂直制表符
\\ 表示\本身