正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在不少文本編輯器裏,正則表達式一般被用來檢索、替換那些符合某個模式的文本。php
正則表達式由一些普通字符和一些元字符(metacharacters)組成。正則表達式
檢索工具:grepshell
grep [-cinvABC] 'word' filename:根據關鍵字或正則表達式在文件中查找匹配的行數據庫
-c:顯示匹配行數vim
-i:不區分大小寫bash
-n:顯示行號app
-v:顯示不匹配的行編輯器
-An:連匹配行的下面n行一塊兒顯示ide
-Bn:連匹配行的上面n行一塊兒顯示工具
-Cn:連匹配行的上下n行一塊兒顯示
--color:將匹配到的關鍵字用紅色標識
-r:遞歸查詢某個目錄下的全部文件
--include=FILE_PATTERN:只搜索匹配表達式的文件
--exclude=FILE_PATTERN:不搜索匹配表達式的文件
--exclude-dir=PATTERN:不搜索匹配表達式的目錄
正則表達式之元字符:
'[0-9]' 表示包含任意數字
'[a-zA-Z]' 表示包含任意字母
'^word' 表示首字符是word
'word$' 表示尾字符是word
'^$' 表示空行;在正則表達式中^被定義爲行首,$被定義爲行尾
'^[a-zA-Z]' 表示以字母開頭的行
'^[^0-9]' 表示以非數字字符開頭的行;說明:在[]裏面加^表示取非
. 表示一個任意字符
.*表示任意個任意字符,包括空行
如下幾個是用來處理重複字符的元字符
* 表示任意個*前面的字符,等價\{0,\};如'r*t'匹配了't'、'rt'、'rrt'…
+ 匹配1個或1個以上的+前面的字符,等價\{1,\};如'r+t'匹配了'rt'、'rrt'…不匹配'rt'
?匹配0個或1個?前面的字符,等價\{0,1\};如'r\?t'匹配了't'、'rt'
c{n} 匹配n個c(字符)
c{n,} 匹配n個或n個以上的c
c{n,m}匹配字符c的個數範圍,表示最少匹配n個c,最多匹配m個c
=====================================
'word_1|word_2' 管道符表示或,匹配word_1或word_2
'(root)?' 小括號表示一個總體,是一個字,主要用來和處理重複字符的元字符結合使用
標藍底的是屬於egrep的擴展元字符,若是要在grep中使用egrep的擴展元字符,必須使用-E參數或加\;
如\+、\?、\{n\}、\{n,\}、\{n,m\}、\|、\(word\)
注:可使用管道符實現多層過濾,以下:只查看文件中可執行的語句。
[root@localhost ~]# grep -v '^#' ~/.bash_profile |grep -v '^$' ~/.bash_profile
空行不包含任何字符。
如需把一個目錄下,全部*.php 文檔中含有 eval 的行 過濾出 [root@localhost ~]# grep -r --include="*.php" 'eval' /data/
^和-v的區別:
grep '^[^0-9]' file 等價 grep -v '^[0-9]' file 匹配非數字字符開頭的行 顯示非數字開頭的行
grep '[^0-9]' file 不等價 grep -v '[0-9]' file 匹配包含非數字字符的行 顯示不包含數字的行
sed:查找、替換工具
-i:直接修改原文件,默認並不修改,只是打印結果
-r:引用擴展正則表達式
-n:限制打印區域,只打印匹配的行,不加則打印所有內容且匹配的行會重複出現一次
p將前面正則表達式所匹配的行打印出來
sed -n '2p' test.txt 打印第2行
sed -n '/root/p' test.txt 打印包含root的行,字符串表達式得用//括起來
sed -nr '/root|users/p' test.txt 打印包含root或者users的行
-e:實現多個任務同時進行,也可使用;實現
sed -n -e '/root/p' -e '/mail/p' test.txt 任務一打印匹配root的行,任務二打印匹配mail的行
sed -n '1p;3,$p' test.txt 打印第一行和第三行到最後一行
d將前面正則表達式所匹配到的行刪除
sed '/user/d' test.txt 刪除包含user的行
sed '1,3d' test.txt 刪除第1行到第3行
替換字符串和vim編輯器中的方式相同,s是替換的意思,g是全局的意思,/能夠用#@代替
sed '4,$s/word1/word2/g' test.txt 從第4行開始將全文中的word1替換成word2
刪除字符串
sed 's/word1//g' test.txt
調換2個字符串的位置
sed -r 's/(word1)(.*)(word2)/\3\2\1/' 1對應第一個小括號,2對應第一個小括號,3對應第一個小括號。
打印某行到某行的內容
sed -n '/word1/,/word2/'p filename 打印word1到word2的行
調換/etc/passwd的第一段和最後一段
sed -r 's/(^[^:]+)(:.*:)([^:]+$)/\3\2\1/g' /etc/passwd
awk:根據預設的分隔符和表達式,對相應區域進行處理並顯示
gawk 是一個模式掃描及處理語言。缺省狀況下它從標準輸入讀入並寫至標準輸出。awk可以使用變量、關係運算符、if關鍵詞
使用方法:awk '{pattern + action}' {filenames}
儘管操做可能會很複雜,但語法老是這樣,其中 pattern 表示 AWK 在數據中查找的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號({})不須要在程序中始終出現,但它們用於根據特定的模式對一系列指令進行分組; pattern就是要表示的正則表達式。
變量
$n:表示分段後的區域,$1表示第一段,$0表示整行
OFS:指定通用分隔符,用於處理結果的顯示
NF:該行分段後的區域數量,$NF表示該行最後一段
NR:當前處理記錄是已處理文件中的第幾行(當有多個文件對象時)
FNR:當前處理記錄是所屬文件中的第幾行
關係運算符
>,<,>=,<=,==,!=,!~
比較數字時,不要加雙引號
命令鏈接符
; 執行多個任務;等價shell中的命令鏈接符,將多條awk命令寫在一條awk命令中執行。例如awk '/root/' fruit;awk '$1 ~/admin/ {print $1}' fruit 等價 awk '/root/;$1 ~/admin/ {print $1}' fruit,也可使用if,如awk '{if (/root/) print $0}{if ($1 ~/admin/) print $1}' fruit
|| 設置多個可匹配的表達式 awk '/word1/ || /word1/' fruit
&&
awk '/apple/ || /3/' fruit
算術運算符 + - * / =
給$n賦值時,須要給字符串用""而不是//
命令行方式:awk [-F 'field-separator'] 'commands' input-file(s)
-F:指定域分隔符,默認是空格
-v:引用shell變量 -v name=$shell
檢索是否包含某字符串時,得用//括起;sed和awk的匹配規則若是是正則表達式而不是純字符串則無須加//。
[root@asus test]# awk '/apple/' fruit
能夠經過指令控制打印的內容;指令若是沒寫,默認打印匹配的行。
匹配規則能夠不寫,指令必須使用{}括起來;多個指令能夠根據需求用;號寫在一個{}裏。
[root@asus test]# cat fruit
apple 3 46
banana 3 33
peach 6 43
pear 4 65
strawberry 6 44
watermelon 2 100
cherry 7 100
[root@asus test]# awk -F ' ' '$1=="pear" || $1 ~/water/ {print $1"¥"$2*$3}' fruit
pear¥260
watermelon¥200
[root@asus test]# awk -F ' ' '{if($1=="pear" || $1 ~/water/) print $1"¥"$2*$3}' fruit
pear¥260
watermelon¥200
[root@asus test]# awk -F ' ' '$1=="pear" || $1 ~/water/ {$4=$2*$3;print $1"="$4"¥"}' fruit
pear=260¥
watermelon=200¥
[root@asus test]# awk -F " " '$1=="pear" || $1 ~/water/ {OFS="-";$4=$2*$3;print NR,$1"="$4"¥"}' fruit
4-pear=260¥
6-watermelon=200¥
[root@asus test]#
須要注意的是,沒有設置匹配規則時,每一個{}裏的指令都會執行;反之,若是設置了匹配規則且有多個{指令}時,當表達式匹配到相應內容時,第一個{}裏的指令纔會執行,不然,只執行第一個{}後面的指令。簡而言之,就是當表達式生效時,第一個{}纔會執行
[root@asus tesst]# awk -F " " '$1=="pear" || $1 ~/water/ {OFS="-"}{$4=$2*$3;print NR,$1"="$4"¥"}' fruit
1 apple=138¥
2 banana=99¥
3 peach=258¥
4-pear=260¥
5-strawberry=264¥
6-watermelon=200¥
7-cherry=700¥
[root@asus test]#
因此,通常狀況下最好將指令寫在同一個{}內。
可使用END指定{指令}直到最後才執行 [root@localhost ~]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' 1.txt
awk想打印字符串得加雙引號,若是包含特殊字符就得將他用 單引號 雙引號 特俗字符 雙引號 單引號括起來
如:awk '{print "This is a '"'"'"$1}' filename
grep 是專門用於文本檢索的文本編輯工具;sed是tr的升級,能夠刪除、打印匹配的行,替換、刪除字符串;awk是cut的升級,不只能夠以行爲單位,還能夠將行分段,以域爲單位進行檢索、編輯,還能夠控制域的輸出,它相似一種數據庫操做語言。grep使用-E參數,sed使用-r參數,而awk使用--posix參數就可使用擴展表達式符