1. 程式人生 > >Shell基礎(四):正則表示式、cut、awk、sed命令

Shell基礎(四):正則表示式、cut、awk、sed命令

前言:

正則表示式是描述字元排列和匹配模式的一種語法規則。主要用於字串的模式分割、匹配、查詢及替換。(主要為了模糊匹配)

1、正則表示式與萬用字元區別

萬用字元(* ? [])用來匹配符合條件的檔名,是完全匹配。ls、find、cp這些命令不支援正則表示式,支援萬用字元匹配。 正則表示式用來匹配在檔案中的字串,是包含匹配。grep、awk、sed等命令支援正則表示式。

2、基礎正則表示式

“*”前一個字元匹配0次或任意多次 “a*”匹配所有內容,包括空格 “ab*”匹配包含ab、abb、abbb...等字元的字串,“*”只對b起作用 “abc*”匹配包含abc、abcc、abccc...等字元的字串
“.”匹配除了換行符外任意一個字元 “s..d”匹配s和d之間有兩個字元的 “ s.*d ”匹配s和d之間有任意多字元 “^”匹配行首,“$”匹配行尾 “^a”匹配以a開頭的行 “$a”匹配以a結尾的行 “^$”匹配空白行 []匹配中括號中指定的任意一個字元 “a[bcd]f”匹配abf、acf、adf中的一個 “^[0-9]”匹配數字開頭的行 [^]匹配空號中字元以外的一個字元 “^[^0-9]”匹配以非數字開頭的行 “^[^a-zA-Z]”匹配非字母開頭的行 “\”轉義字元,使之後的一個特殊字元變為普通字元 “\*”就是普通字元* “\$$”匹配以$結尾的行 “\{n\}”匹配前面字元出現n次的字串
“a\{4\}”連續出現4個a的行 “[0-9]\{4\}”連續出現4個數字的行,不一定完全一樣的數字 “a\{2,5\}”a最少出現2次,至多出現5次的行 例: “[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}”匹配格式為1991-04-15的日期 [0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}”匹配格式為192.168.1.103的IP地址

3、字元擷取命令

3.1 cut命令

cut命令用於列提取,預設分隔符是tab鍵。

選項:-d指定分隔符,-f指定提取第幾列

例:cut  -t  ":"  -f1  /etc/passwd                  已:為分隔符提取檔案的第一列

grep "/bin/bash" /etc/passwd | grep -v root | cut -f1 -d ":"            列出系統中普通使用者的使用者名稱

3.2 awk命令

語法格式:awk  '條件1{動作1}條件2{動作2}...'  檔案

條件,一般使用關係表示式作為條件,如a>10。動作,格式化輸出或流程控制語句

awk一次讀入一整行,預設以tab鍵或者空格為分隔符將一行分為多個欄位,表示為$1、$2、$3...其中$0表示檔名

例:awk  '{printf $2 "\n"}'  /etc/passwd               列印檔案的第二列,其中的轉義字元要加雙引號

df  -h | grep "/dev/sda5" | awk '{print  $5}' | cut -d "%" -f1          顯示某分割槽磁碟使用量百分比

awk  '$3>60{printk  $4}'  filename              關係運算符成立才執行括號中命令

BEGIN、END作為關係表示式,表示命令執行開始時和結束時

例:awk  'BEGIN{FS=":"}{print  $1  "\t"  $3}'  /etc/passwd    開始執行時FS指定分隔符

awk  'END{print "goodbye"}{print $2}'  filename            結束時列印一句話

補充:格式化輸出printf、print

格式:printf  '輸出型別輸出格式'  輸出內容

輸出型別:%ns,輸出n個字串。%ni,輸出n個整數。%m.nf,輸出浮點數,n為小數位數,m-n為整數位數

輸出格式:\n換行、\r回車、\a輸出警告聲、\t水平製表符、\v垂直製表符、\b退格符、\f清屏符

print與printf不同之處在於,print自帶換行符,比較方便

3.3 sed命令

sed命令主要用來將資料進行選取、替換、刪除、新增的命令

sed  [選項]  '動作'  檔名

選項:-n:只會將sed處理的行輸出,否則預設全篇輸出

   -e:允許進行多個動作

   -i:sed修改預設是臨時修改,-i選項表示直接修改檔案

動作:a:追加,在當前行後新增

   c:行替換

   i:在當前行前插入

   d:刪除指定行

   p:列印輸出指定行

   s:字串替換,格式:行範圍s/舊字串/新字串/g

例:sed  - n  '2p'  filename                     列印輸出第二行

sed  -i  '2,4d'  filename                    刪除2至4行

sed  -i  '2a  helloworld'  filename    第二行追加內容

sed  -i  '3c  helloworld'  filename    替換第3行

sed  -i  '3i  helloworld'   filename     在第3行前插入

sed  -i  '2s/goodbye/goodnight/g'  filename   第2行的goodbye替換為goodnight

sed  -ie  's/Sunday/Monday/g;s/Tuesday/Saturday/g'   filename   同時多個動作

3.4 sort、wc命令

sort命令用來排序

sort  [選項]  檔名

選項:

-f:忽略大小寫

-n:以數值型進行排序,預設是字串排序

-r:反向排序

-t:指定分隔符,預設分隔符是tab鍵

-k  n[,m]:指定排序的欄位範圍,n欄位開始,m欄位結束(可選),預設是到結尾

例:sort  /etc/passwd      按首字母排序

sort  -t ":"  -k "3,3"  /etc/passwd    指定冒號為分隔符,以第3欄位為排序依據

sort -n  -t ":"  -k "3,3"  /etc/passwd 指定以數字型排序,若以字串形式排序是先判斷第一個字元的順序,第一個字元相同再判斷第2個字元,以此類推

若以數值排序優先順序:1>2>3>12>23>137>258

若以字元排序優先順序:1>12>137>2>23>258>3

wc命令 統計命令

wc [選項] 檔名

-l:只統計行數

-w:只統計單詞數

-m:只統計字元數,包括換行符