A gentleman is open-minded and optimistic; a small person is narrow-minded and pessimistic.html
"君子坦蕩蕩,小人長慼慼"git
參考資料:鳥哥的Linux私房菜 基礎學習篇(第三版)
正則表達式
1、正則表達式基礎shell
一、什麼是正則表達式編程
正則表達式(Regular Expression, RE)是對字符串操做的一種邏輯公式,就是用一些事先定義好的特定字符及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯
編程語言
二、爲何要學習正則表達式工具
因爲其強大的字符串處理能力,目前許多工具和編程語言都支持正則表達式,熟練掌握它能夠幫助咱們更高效的完成工做學習
三、語系對正則表達式的影響編碼
因爲不一樣的語系其編碼順序不同,致使正則表達式的匹配結果可能不同,因此在使用以前應該先確認當前的語系,也可使用下面這些特殊符號來避免不一樣語系帶來的問題:spa
特殊符號 | 表明意義 |
[: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:] | 標點符號,即 ",',?,!,;,:,#,$ |
[:upper:] | 大寫字母,A-Z |
[:space:] | 任何會產生空白的字符,包括空格鍵[Tab] CR等 |
[:xdigit:] | 十六進制的數字類型,包括0-9,A-F,a-f |
四、基礎正則表達式字符
RE字符 | 意義與範例 |
^word | 意義:以word開頭 範例:查找以'#'開頭的那一行 grep -n '^#' filename |
word$ | 意義:以word結尾 範例:查找以'!'結尾的那一行 grep -n '!$' filename |
. | 意義:表明必定有一個任意字符的字符 範例:查找包含字符'a'而且'a'後面至少有一個字符的那一行 grep -n 'a.' filename |
\ | 意義:轉義字符,將特殊符號的特殊意義去除 範例:查找包含單引號的那一行 grep -n \' filename |
* | 意義:重複零到無窮多個的前一個字符 範例:查找包含(es)(ess)(esss)等字符串所在的行 grep -n 'ess*' filename |
[list] | 意義:list中的任意一個字符均可以被匹配 範例:查找包含'get'或者'got'的行 grep -n 'g[eo]t' filename |
[n1-n2] | 意義:n1-n2範圍內的任意一個字符均可以被匹配 範例:查找包含數字的那一行 grep -n '[0-9]' filename |
[^list] | 意義:不包含在list中的其餘任意一個字符 範例:查找不包含大寫字母的那一行 grep -n '[^A-Z]' filename |
\{n,m\} | 意義:連續n到m個的前一個字符,若爲\{n\}則是連續n個前一個字符, \{n,\}爲連續n到無窮多個前一個字符 範例:查找包含'goog'或者'gooog'的那一行 grep -n 'go\{2,3\}g' filename |
五、擴展正則表達式
擴展正則表達式能夠經過組合功能,將屢次查找變爲一次查找,使用 grep -E 或者 egrep 來支持擴展正則表達式
六、擴展正則表達式字符與範例
RE字符 | 意義與範例 |
+ | 意義:重複一個或一個以上的前一個RE字符 範例:查找(god)(good)(goood)等的字符串 egrep -n 'go+d' filename |
? | 意義:零個或一個的前一個RE字符 範例:查找(gd)(god)這兩個字符串 egrep -n 'go?d' filename |
| | 意義:用‘或’的方式找出知足不一樣條件的字符串 範例:查找包含'gd'或'good'或'dog'的字符串 egrep -n 'gd|good|dog' filename |
() | 意義:找出‘組’字符串 範例:查找包含(glad)或(good)的字符串 egrep -n 'g(la|oo)d' filename |
()+ | 意義:多個重複組的判別 範例:查找'A'開頭'C'結尾,而且'A'和'C'之間包含一個以上的'xyz'的字符串 egrep -n 'A(xyz)+C' filename |
2、使用正則表達式的工具
一、sed工具
sed是一種以行爲單位,對數據進行替換、刪除、新增、選取特定行等操做的工具,同時也支持管道
1 用法:sed [-nefr] [動做] 2 參數說明: 3 -n :使用安靜模式,加上-n使得只有通過sed處理的那一行纔會被顯示出來 4 -e :直接在命令行模式上進行sed的動做編輯 5 -f :直接將sed的動做寫在一個文件內,-f filename則能夠執行filename內的sed動做 6 -r :sed的動做支持的是擴展正則表達式的語法(默認爲基礎正則表達式語法) 7 -i :直接修改讀取的文件的內容,而不是由屏幕輸出
8 動做說明: [n1[,n2]] function 9 n1, n2 :通常表明選擇進行動做的行數,不必定存在 10 funciton有下面這些參數: 11 a :新增,a後面可接字符串,這些字符串會在新的一行出現(當前行的下一行) 12 c :替換,c後面可接字符串,這些字符串能夠替換n1, n2之間的行 13 d :刪除,後面一般不接參數 14 i :插入,後接字符串,這些字符串將會出如今新的一行(當前行的上一行) 15 p :打印,將某個選擇的數據打印出來,一般 p 會與 sed -n 一塊兒運行 16 s :替換,能夠直接進行替換,一般配合正則表達式使用
範例:
1 ①以行爲單位的新增/刪除: 2 $ sed '2,5d' filename #刪除第2~5行 3 $ sed '2a hello world' filename #在第二行後面新增一行,內容爲「hello world」 4 ②以行爲單位的替換與顯示: 5 $ sed '2,5c No 2-5 number' filename #將第2~5行替換爲新的一行,內容爲‘No 2-5 number’ 6 $ sed -n '2,5p' filename #打印第2~5行,若是不加-n則會把全部數據都輸出一遍 7 ③部分數據的查找並替換:sed 's/old/new/g' filename #將'old'替換爲'new' 8 $ sed 's/#.*$//g' #刪除註釋 9 $ sed '/^$/d' #刪除空行 10 ④直接修改文件內容:加上-i參數能夠直接修改文件內容(利用這個功能能夠在代碼文件中將多行代碼註釋掉)
推薦閱讀:sed簡明教程
二、awk工具
awk是一種優良的文本處理工具,支持正則表達式和管道,常常用於將一行分紅數個‘字段’來處理
1 用法:awk '條件類型1{動做1} 條件類型2{動做2} ...' filename #字段分隔符默認爲空格或[tab]鍵
處理流程:
①讀入第一行,並將第一行的數據填入$0,$1,...等變量當中;
②依據條件類型的限制,判斷是否要進行後面的動做;
③作完全部動做與條件類型;
④重複①~③,直處處理完全部數據;
1 #字段的變量名稱:$0表示整一行,$1表明第一個字段,以此類推 2 #內置變量:NF(每一行擁有的字段總數)、NR(當前處理的行是第幾行)、FS(目前的分隔符) 3 #邏輯運算符:>、<、>=、<=、==、!= 4 #關鍵字:BEGIN、END 5 #語法: BEGIN{這裏面放的是執行前的語句} 7 # END{這裏面放的是處理完全部行後要執行的語句} 9 # {這裏面放的是處理每一行要執行的語句}
範例:
假設有一個文件名爲pay.txt,內容以下:
1 # Name 1st 2nd 3th 2 # VBird 23000 24000 25000 3 # DMTsai 21000 20000 23000 4 # Bird2 43000 42000 41000
若是我要計算每個人的總額,而且按照必定的格式打印出來,那麼能夠這樣:
1 $ cat pay.txt | awk 'NR==1{printf "%10s %10s %10s %10s %10s\n", $1, $2, $3, $4, "Total" } 2 > NR>=2{total = $2 + $3 + $4 3 > printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'
其中的printf的用法和C語言中的差很少,輸出的結果相似這樣:
1 # Name 1st 2nd 3th Total 2 # VBird 23000 24000 25000 72000.00 3 # DMTsai 21000 20000 23000 64000.00 4 # Bird2 43000 42000 41000 126000.00
推薦閱讀:AWK 簡明教程
3、其餘工具
一、文件比較工具: diff、cmp、patch
1 # diff:一般用於同一文件的新舊版本區別上,以行爲單位比較 2 #用法:diff [-bBi] from-file tofile #比較from-file和to-file並輸出不一樣的地方 3 # cmp:以‘字節’爲單位比較 4 #用法:cmp [-s] file1 file2 #按字節比較file1和file2,並輸出發現的第一個不一樣點,加上-s輸出全部不一樣點 5 # patch:與 diff 配合製做補丁文件和升級文件 6 #用法: 7 $ diff -Naur oldfile newfile > patch_file #經過比較新舊文件製做補丁文件,patch_file一般以.patch爲後綴 8 $ patch -pN < patch_file #更新舊文件,N表示取消幾層目錄 9 $ patch -R -pN < patch_file #還原爲原來的文件
二、文件打印準備: pr
1 # pr:爲要打印的文件設置標題和頁碼 2 #用法:pr filename #爲filename的輸出加上文件時間、文件名稱和頁碼
總結:正則表達式真的是一種很是有用的工具,由簡單的規則能夠搭配出複雜的字符串,不過伴隨着高效率的每每是高難度,須要之後不斷的使用才能逐漸掌握