05 shell程式設計之正規表示式

彈指流沙間發表於2018-06-11

正規表示式&&文字處理利器

學習目標:

l  掌握正規表示式的運用

l  掌握sed、awk文字處理工具的使用

目錄結構:

 

 

 

正規表示式

正規表示式概述

l  正規表示式:使用單個字串來描述,匹配一系列符合某個句法規則的字串

l  由普通字元與特殊字元組成

l  一般用在指令碼程式設計,文字編輯器中,如php、Python、shell等,簡寫為regex、regexp、RE

l  用來檢索、替換符合模式的文字,具有強大的文字匹配功能

l  能夠在文字海洋中快速高效地處理文字

l  正規表示式層次

基礎正規表示式

擴充正規表示式

l  Linux中文字處理工具

grep

sed

awk

正規表示式元字元

l  基礎正規表示式是常用的正規表示式部分

l  除了普通字元外,常見到以下元字元

\:轉義字元,使符號就是符號,不存在其他含義。\!,\n等

^:匹配字串開始的位置

       例:^a, ^the, ^#

$:匹配字串結束的位置

       例:word$

.:匹配除\n之外的任意的一個字元

       例:go.d , g..d

*:匹配前面子表示式0次或者多次

       例:goo*d,go*d

[list]:匹配list列表中的一個字元

       例:go[ola]d , [abc], [a-z], [a-z0-9]

[^list]:匹配任意不在list列表中的一個字元

       例:[^a-z], [^0-9], [^A-Z0-9]

\{n,m\}:匹配前面的子表示式n到m次,有\{n\}, \{n,\}, \{n,m\}三種格式

       例:go\{2\}d, go\{2,3\}d, go\{2,\}

擴充套件正規表示式元字元

l  擴充套件正規表示式是對基礎正規表示式的擴充深化

l  擴充套件元字元

+:匹配前面子表示式1次以上

       例:go+d, 將匹配至少一個o

?:匹配前面子表示式0次或者1次

       例:go?d, 將匹配gd或者god

():將括號中的字串作為一個整體

       例:(xyz)+, 將匹配xyz整體1次以上,如xyzxyz

|:以或的方式匹配字條串

       例1:good|food,將匹配good或者food

       例2:g(oo|la)d,將匹配good或者glad

 

Sed工具實踐

sed工具概述

l  sed是文字處理工具,讀取文字內容,根據指定的條件進行處理,如刪除,替換,新增等

l  可在無互動的情況下實現相當複雜的文字處理操作

l  被廣泛應用於shell指令碼,以完成自動化處理任務

l  Sed依賴於正規表示式

Sed用法舉例

l  替換舉例

sed ‘s/xml/XML/’ bfile  //將每行中的第一個xml替換為XML

sed ‘s/xml//g’ bfile  //將檔案中所有xml刪除

sed ‘3,5s/xml/XML/g’ bfile  //將第3-5行中的所有xml都替換為XML

sed ‘/xml/s/com/COM/g’ bfile  //將包含xml的所有行中的com都替換為COM

l  多次執行編輯命令

sed -e ‘3,5p’ -e ‘3,5s/xml/XML/g’ bfile  //可將多個編輯命令儲存到檔案中,通過-f指定檔案,以完成多個處理操作

 

這只是sed和正規表示式的結合使用的部分案例

有關sed的具體使用詳見https://www.cnblogs.com/zwgblog/p/6013975.html

awk工具實踐

awk工具介紹

l  awk也是一個功能強大的編輯工具,與sed一樣,可在無互動的情況下實現相當複雜的文字操作

l  命令格式

awk 選項 ‘模式或條件{編輯指令}’ 檔案1 檔案2

awk -f 指令碼檔案 檔案1 檔案2

l  工作原理

逐行讀取文字,預設以空格為分隔符進行分割,將分隔所得的各個欄位儲存到內建變數中,並按模式或者條件執行編輯命令

l  awk 內建變數

FS:指定每行文字的分隔符,預設為空格或製表位

NF:當前處理的行的欄位個數

NR:當前處理的行的行號(序數)

$0:當前處理的行的整行內容

$n:當前處理行的第n個欄位(第n列)

awk工具舉例

l  列印文字內容

awk ‘NR==1,NR==3{print}’ bfile  //輸出第一至第三行內容

awk ‘NR==1|NR==3{print}’ bfile  //輸出第一行,第三行內容

awk ‘/^root/{print}’ /etc/passwd  //輸出以root開頭的行

 

l  按欄位輸出文字

awk ‘{print $1,$3}’ bfile  //輸出每行中的第1,第3個欄位

awk -F “:” ‘{print$1,$7}’ /etc/shadow  //輸出密碼為空的使用者的shadow記錄

 

同理awk的具體介紹詳見http://blog.chinaunix.net/uid-23302288-id-3785105.html

 

至此shell程式設計的基本知識都已經瞭解完畢了,詳見博主主頁 http://www.cnblogs.com/tzlsj。shell程式設計博大精深,擅長處理各種檔案,與Linux的一切皆檔案的特點十分契合。

現在瞭解的shell知識點猶如四則運演算法則,看似很簡單,實則各種組合變化。接下來我會給大家找一些好玩的小指令碼,進行shell的實際運用和鞏固強化。

相關文章