正則就是用一些具備特殊含義的符號組合到一塊兒(稱爲正則表達式)來描述字符或者字符串的方法。或者說:正則就是用來描述一類事物的規則。linux
在linux中,通配符是由shell解釋的,而正則表達式則是由命令解釋的,下面咱們就爲你們介紹三種文本處理工具/命令:grep、sed、awk,它們三者都可以解釋正則。git
參數正則表達式
-n :顯示行號
-o :只顯示匹配的內容
-q :靜默模式,沒有任何輸出,得用$?來判斷執行成功沒有,即有沒有過濾到想要的內容shell
-l :若是匹配成功,則只將文件名打印出來,失敗則不打印,一般-rl一塊兒用,grep -rl 'root' /etc
-A :若是匹配成功,則將匹配行及其後n行一塊兒打印出來
-B :若是匹配成功,則將匹配行及其前n行一塊兒打印出來
-C :若是匹配成功,則將匹配行及其先後n行一塊兒打印出來
--color
-c :若是匹配成功,則將匹配到的行數打印出來
-E :等於egrep,擴展
-i :忽略大小寫bash
-v :取反,不匹配
-w:匹配單詞編輯器
舉例一:函數
[root@MiWiFi-R3-srv ~]# cat a.txt root123 ROot asdf Root_123 rOOtss root 123 [root@MiWiFi-R3-srv ~]# grep -i "root" a.txt root123 ROot asdf Root_123 rOOtss root 123 [root@MiWiFi-R3-srv ~]# grep -w "root" a.txt root 123
grep種類
grep
fgrep
pgrep
egrep工具
正則介紹spa
^ 行首
$ 行尾
. 除了換行符之外的任意單個字符
* 前導字符的零個或多個
.* 全部字符
[] 字符組內的任一字符
[^] 對字符組內的每一個字符取反(不匹配字符組內的每一個字符)
^[^] 非字符組內的字符開頭的行
[a-z] 小寫字母
[A-Z] 大寫字母
[a-Z] 小寫和大寫字母
[0-9] 數字
\< 單詞頭 單詞通常以空格或特殊字符作分隔,連續的字符串被當作單詞
\> 單詞尾orm
擴展正則 sed 加 -r 參數 或轉義
grep 加 -E 或 egrep 或轉義
AWK 直接支持 但不包含{n,m}
可使用--posix支持
[root@MiWiFi-R3-srv ~]# awk '/ro{1,3}/{print}' /etc/passwd
[root@MiWiFi-R3-srv ~]# awk --posix '/ro{1,3}/{print}' /etc/passwd
sed -n '/roo\?/p' /etc/passwd
sed -rn '/roo?/p' /etc/passwd
? 前導字符零個或一個
+ 前導字符一個或多個
abc|def abc或def
a(bc|de)f abcf 或 adef
x\{m\} x出現m次
x\{m,\} x出現m次至屢次(至少m次)
x\{m,n\} x出現m次至n次
posix定義的字符分類
[:alnum:] Alphanumeric characters.
匹配範圍爲 [a-zA-Z0-9]
[:alpha:] Alphabetic characters.
匹配範圍爲 [a-zA-Z]
[:blank:] Space or tab characters.
匹配範圍爲 空格和TAB鍵
[:cntrl:] Control characters.
匹配控制鍵 例如 ^M 要按 ctrl+v 再按回車 才能輸出
[:digit:] Numeric characters.
匹配全部數字 [0-9]
[:graph:] Characters that are both printable and visible. (A space is print-
able, but not visible, while an a is both.)
匹配全部可見字符 但不包含空格和TAB 就是你在文本文檔中按鍵盤上能用眼睛觀察到的全部符號
[:lower:] Lower-case alphabetic characters.
小寫 [a-z]
[:print:] Printable characters (characters that are not control characters.)
匹配全部可見字符 包括空格和TAB
能打印到紙上的全部符號
[:punct:] Punctuation characters (characters that are not letter, digits, con-
trol characters, or space characters).
特殊輸入符號 +-=)(*&^%$#@!~`|\"'{}[]:;?/>.<,
注意它不包含空格和TAB
這個集合不等於^[a-zA-Z0-9]
[:space:] Space characters (such as space, tab, and formfeed, to name a few).
[:upper:] Upper-case alphabetic characters.
大寫 [A-Z]
[:xdigit:] Characters that are hexadecimal digits.
16進制數 [0-f]
sed
流編輯器 stream editer,是以行爲單位的處理程序
sed 流編輯器 stream editer
語法
sed [options] 'command' in_file[s]
options 部分
-n
-e
-i
-f
command 部分
'[地址1,地址2] [函數] [參數(標記)]'
定址的方法 1.數字 2.正則
數字
十進制數
1 單行
1,3 範圍 從第一行到第三行
2,+4 匹配行後若干行
4,~3 從第四行到下一個3的倍數行
2~3 第二行起每間隔三行的行
$ 尾行
1! 除了第一行之外的行
正則
正則必須用//包裹起來
擴展正則須要用 -r 參數或轉義
數字定址:sed -n '1p' /etc/passwd
正則定址:sed -n '/^root/p' /etc/passwd
正則介紹
^ 行首
$ 行尾
. 除了換行符之外的任意單個字符
* 前導字符的零個或多個
.* 全部字符
[] 字符組內的任一字符
[^] 對字符組內的每一個字符取反(不匹配字符組內的每一個字符)
^[^] 非字符組內的字符開頭的行
[a-z] 小寫字母
[A-Z] 大寫字母
[a-Z] 小寫和大寫字母
[0-9] 數字
\< 單詞頭 單詞通常以空格或特殊字符作分隔,連續的字符串被當作單詞
\> 單詞尾
擴展正則 加 -r 參數 或轉義
sed -n '/roo\?/p' /etc/passwd
sed -rn '/roo?/p' /etc/passwd
? 前導字符零個或一個
+ 前導字符一個或多個
abc|def abc或def
a(bc|de)f abcf 或 adef
x\{m\} x出現m次
x\{m,\} x出現m次至屢次(至少m次)
x\{m,n\} x出現m次至n次
函數
增刪改
a 後插
c 替換
i 前插
d 刪除
輸入輸出
p 打印匹配的行 通常和 -n 參數連用,以屏蔽默認輸出
r 從文件中讀入
w 寫入到文件中
控制流
! 命令取反 例: 1!d 刪除第一行之外的行
{} 命令組合 命令用分號分隔 {1h;G} 能夠理解爲 -e 參數的另外一種寫法
= 打印行號(輸入行的號碼,而非處理的次數行號) 例如: sed -n '2{=;p}' infile
n 讀入下一行到模式空間 例:'4{n;d}' 刪除第5行
N 而是追加下一行到模式空間,再把當前行和下一行同時應用後面的命令
替換
s 字符串替換 s/old/new/
$ sed -n 's/root/ABCDEF/p' /etc/passwd
ABCDEF:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ABCDEF:/sbin/nologin
$ sed -n 's/root/ABCDEF/gp' /etc/passwd
ABCDEF:x:0:0:ABCDEF:/ABCDEF:/bin/bash
operator:x:11:0:operator:/ABCDEF:/sbin/nologin
$ sed -n 's/root/ABCDEF/2p' /etc/passwd
root:x:0:0:ABCDEF:/root:/bin/bash
$ sed -n 's/root/ABCDEF/3p' /etc/passwd
root:x:0:0:root:/ABCDEF:/bin/bash
$ sed -n 's/root/ABCDEF/gp' /etc/passwd
ABCDEF:x:0:0:ABCDEF:/ABCDEF:/bin/bash
operator:x:11:0:operator:/ABCDEF:/sbin/nologin
$
\(\) 保存被匹配的字符 以備反向引用\N時使用 最多9個標籤 標籤順序從左至右& 替換時使用,在不定義標籤時使用(反向引用)