shell正則表達式、grep命令和sed命令舉例詳解
一.正則表達式概述
1.正則表達式定義
1.1 定義
- 使用字符串描述、匹配一系列符合某個規(guī)則的字符串
1.2 了解
- 普通字符: 大小寫字母、數(shù)字、標點符號及一些其它符號
- 元字符: 在正則表達式中具有特殊意義的專用字符
1.3 層次分類
- 基礎(chǔ)正則表達式
- 擴展正則表達式
- 編程語言支持的高級正則表達式
1.4 linux三劍客(grep sed awk)支持的正則表達式
- shell是不支持正則表達式的(shell支持的是通配符)。shell中的正則表達式只有個別命令支持的,一般常用的是Linux三劍客
支持正則的shell命令 | 正則類型 |
---|---|
grep | 默認使用基本正則表達式(BRE)(要使用擴展正則需要加轉(zhuǎn)義字符) |
egrep 或 grep -E | 使用擴展的正則表達式(ERE) |
sed | 默認使用基本正則表達式(BRE) |
awk | 使用擴展正則表達式(ERE) |
2.基礎(chǔ)正則表達式的元字符
基礎(chǔ)正則表達式是常用的正則表達式部分
\ | 表示轉(zhuǎn)義字符,去掉特殊符號的特殊含義 |
. | 匹配任意單個字符 |
^ | 匹配字符串開頭的位置 |
$ | 匹配字符串末尾的位置 |
* | 匹配前面的字符出現(xiàn)0~+∞ |
[list] | 匹配list列表中的一個字符(列表中只要有一個符合即可) |
[^list] | 匹配任意非list列表中的一個字符 |
{n} | 匹配前面的子表達式n次 |
{n,} | 匹配前面的子表達式最少n次 |
{,n} | 匹配前面的子表達式最多n次 |
{n,m} | 匹配前面的子表達式n到m次 |
[ ] | 代表單個字符 |
\? | 1次或0次 |
^$ | 空行 |
.* | 1~+∞ |
2.1 轉(zhuǎn)義字符的運用
2.1.1 將特殊含義的字符轉(zhuǎn)換為普通字符的含義
被轉(zhuǎn)義的特殊字符 | 轉(zhuǎn)義前的含義作用 |
\ = | 具有賦值的作用,或則進行字符判斷 |
\ ! | 取反 |
\ & | 單個&符可以將命令掛在后臺上,兩個是邏輯符號且的作用 |
\ $ | 取值變量的作用 |
2.1.2 將普通字符轉(zhuǎn)換為特殊作用的字符
被賦予新含義的普通字符 | 現(xiàn)在擁有的作用 |
\n | 換行 |
\t | 轉(zhuǎn)化為制表符 |
\w(小寫) | 匹配包括下劃線的任何單詞字符 |
\W(大寫) | 匹配任何非單詞字符。等通于"[^A-Za-z0-9_]" |
\r | 轉(zhuǎn)換后是回車符 |
\d | 匹配一個數(shù)字字符 |
\D | 匹配一個非數(shù)字字符。等價于[^0-9] |
\s(小寫) | 空白符 |
\S(大寫) | 非空白符 |
2.1.3 中括號表達式
普通中括號包圍的字符組,表示某個單個字符匹配中括號內(nèi)的任意字符即匹配成功
- x[abc]z : 可以匹配包含“xaz”、“xbz”、“xcz”的字符串
- 取反表示法: 中括號內(nèi)開頭使用 ^ ,表示只要不是中括號內(nèi)的字符就匹配
x[ ^abc]z : 可以匹配包含 “xdz”、“xez” 等字符串,但不能匹配包含“xaz”、“xbz”、“xcz”的字符串
特殊元字符在中括號中匹配
- 想要在中括號中匹配: ^ ,需要將其放在 中括號非開頭的位置 ,如:[a^]
- 想要在中括號中匹配: - ,需要將其放在 開頭位置或結(jié)尾位置 ,如:[abc-]、[-abc]
- 想要在中括號中匹配: ] ,需要將其放在 開頭位置 ,如:[]abc]
2.1.4 位置匹配
只匹配字符,不匹配字符
- ^ : 匹配行首
- $ : 匹配行尾
- \b 匹配單詞邊界處的位置(開頭和結(jié)尾) \bword\b 等價于 \<word\>
- \< 匹配單詞開頭處的位置
- \> 匹配單詞結(jié)尾處的位置
- \B 匹配非單詞邊界處的位置
2.1.5 字符類
[:alnum:] | 字母和數(shù)字 |
[:alpha:] | 代表任何英文大小寫字母 A-Z a-z |
[:lower:] | 小寫字母 |
[:upper:] | 大寫字母 |
[:blank:] | 空白字符 |
[:space:] | 包括空格、制表符 (水平和垂直)、換行符、回車符等各種類型的空白,比[:blank:]包含的范圍廣 |
[:cntrl:] | 不可打印的控制字符(退格、刪除、警鈴...) |
[:digit:] | 十進制數(shù)字 |
[:xdigit:] | 十六進制數(shù)字 |
[:graph:] | 可打印的非空白字符 |
[:print:] | 可打印字符 |
[:punct:] | 標點符號 |
2.1.6 量詞
\{m\} : 表示匹配前一個字符或前一個子表達式m次
\{m,n\} : (m<n)表示匹配前一個字符或前一個字表達式最少m次,最多n次
\{m,\} : 表示匹配前一個字符或前一個子表達式至少m次
\{,n\} : 表示匹配前一個字符或前一個字表達式最多n次(匹配0次也算是成功)
* 表示前一個字符或前一個子表達式匹配0次或多次,等價于:{0,}
- .* 匹配任意長度的任意字符
3.擴展正則表達式的元字符
支持awk和egrep使用,如果grep和sed想要正常使用(grep -E sed -r)
元字符 | 作用含義 |
+ | 匹配前面子表達式1次及以上 |
? | 匹配前面子表達式0次或者1次 |
() | 將括號中的字符串作為一個整體 |
| | 以"或"的方式匹配字符串 |
3.1 擴展常用的量詞
- + 表示匹配前一個字符或前一個子表達式1或多次,即至少一次 等價于 {1, }
- ? 表示匹配前一個字符或前一個子表達式0或1次,等價于 {0,1} 等價于 {,1}
3.2 分組捕獲和反向引用
使用小括號()包圍一部分正則表達式,這部分正則表達式即成為一個分組整體,也稱為一個子表達式。
分組后可以使用 \N 來反向引用對應(yīng)的分組匹配結(jié)果,N是1-9的正整數(shù),\1表示第一個分組表達式的匹配結(jié)果,\2表達第二個分組表達式的匹配結(jié)果。
注意:反向引用引用的是分組匹配后的結(jié)果,不是分組表達式
例如:正則表達式:(abc|def) and \1xyz 可以匹配字符串“abc and abcxyz ” 或“def and defxyz”,但是不能匹配“abc and defxyz” 或 “def and abcxyz”
二.grep 命令
1.命令簡介
grep 是一種強大的文本搜索工具,它能使用正則表達式,并把匹配的行打印出來
格式:
grep [options] pattern [file] options表示:選項; pattern 表示:匹配的的表達式; file 表示:文件名 例如:grep -i "root" /etc/passwd
2.常用選項
-m 數(shù)字 | 匹配到數(shù)字行停止 |
-v | 取反 |
-i | 忽略字符大小寫 |
-n | 顯示匹配的行號 |
-c | 統(tǒng)計匹配的行數(shù) |
-o | 僅顯示匹配到的字符串 |
-q | 靜默模式,不輸出任何信息 |
-A 數(shù)字 | after 后數(shù)字行 |
-B 數(shù)字 | before 前數(shù)字行 |
-C 數(shù)字 | context 前后各數(shù)字行 |
-e | 實現(xiàn)多個選項間的邏輯 or 關(guān)系 |
-E | 使用ERE,相當(dāng)于egrep |
-w | 匹配整個單詞 |
-F | 不支持正則表達式,相當(dāng)于fgrep |
-f | 處理兩個文件相同內(nèi)容,把第一個文件作為匹配條件 |
-r | 遞歸目錄,但不處理軟連接 開始搜索目錄 |
-R | 遞歸目錄,但處理軟連接 |
操作:
-m
-i
-n
-c
-o
-q
-A -B -C
-e
-w
-E
擴展正則中這些元字符可直接使用: ? 、 + 、 { 、 } 、 | 、 ( 和 ) 。
基礎(chǔ)正則中這些元字符前需要加反斜線轉(zhuǎn)義: \? 、 \+ 、 \{ 、 \} 、 \| 、 \( 和 \) 。
grep sed 默認使用基礎(chǔ)正則表達式
grep -E 、 sed -r 、 egrep 、 awk 擴展正則表達式
-r
3.操作
① 統(tǒng)計當(dāng)前主機的連接狀態(tài)
② 統(tǒng)計當(dāng)前連接主機數(shù)
③ 匹配QQ號
④ 匹配電話號碼
⑤ 匹配郵箱
⑥ 統(tǒng)計 /etc/fstab 下面有多少單詞
三.sed命令
1.關(guān)于sed
1.1 簡介
sed 是從文件或管道中讀取一行,處理一行,輸出一行;再讀取一行,再處理一行,再輸出一行,直到最后一行。每當(dāng)處理一行時,把當(dāng)前處理的行存儲在臨時緩沖區(qū)中,稱為模式空間(PatternSpace),接著用 sed 命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕。接著處理下一行,這樣不斷重復(fù),直到文件末尾。一次處理一行的設(shè)計模式使得 sed 性能很高,sed 在讀取大文件時不會出現(xiàn)卡頓的現(xiàn)象。如果使用 vi 命令打開幾十M上百M的文件,明顯會出現(xiàn)有卡頓的現(xiàn)象,這是因為 vi 命令打開文件是一次性將文件加載到內(nèi)存,然后再打開。sed 就避免了這種情況,一行一行的處理,打開速度非???,執(zhí)行速度也很快。
1.2 sed 編輯器的工作過程
sed 的工作流程主要包括讀取、執(zhí)行和顯示三個過程:
- 讀取: sed 從輸入流 (文件、管道、標準輸入) 中讀取一行內(nèi)容并存儲到臨時的緩沖區(qū)中(又稱模式空間,pattern space )。
- 執(zhí)行: 默認情況下,所有的 sed 命令都在模式空間中順序地執(zhí)行,除非指定了行的地址,否則 sed 命令將會在所有的行上依次執(zhí)行。
- 顯示: 發(fā)送修改后的內(nèi)容到輸出流。在發(fā)送數(shù)據(jù)后,模式空間將會被清空。在所有的文件內(nèi)容都被處理完成之前,上述過程將重復(fù)執(zhí)行, 直至所有內(nèi)容被處理完。
注意:默認情況下所有的 sed 命令都是在模式空間內(nèi)執(zhí)行的,因此輸入的文件并不會發(fā)生任何變化,除非使用 "sed -i" 修改源文件、或使用重定向輸出到新的文件中。
1.3 瑪瑪哈哈
怎么解決 sed 命令處理容量過大,或內(nèi)容過多而導(dǎo)致執(zhí)行效率緩慢的問題?
方案一:
使用 split 命令進行文件分割(如果文件是百萬行的,那么我們就創(chuàng)建一個單獨的目錄,將文件分割為一百個一萬行的文本),再使用 sed 命令進行處理,除了使用 split 分割,也可以使用一個遍歷分割shell腳本進行執(zhí)行。
方案二:
cat 文件名 | sed 處理 (這個方案只能針對中型的文件文本,如果文本量過大,處理效果不好)
2.sed 命令與選項操作符
1. 格式
sed [option]... 'script;script;...' [input file...] 選項 自身腳本語法 支持標準輸入管道
2.常用選項
-e | 用指定命令或者腳本來處理輸入的文本文件 只有一個操作命令時省略,一般在執(zhí)行多個操作命令使用 |
-f | 用指定的腳本文件來處理輸入的文本文件 |
-n | 不輸出模式空間內(nèi)容到屏幕,即不自動打印 可以與 p 命令一起使用完成輸出 |
-r -E | 使用擴展正則表達式 |
-h | 顯示幫助 |
-i | 直接修改目標文件 |
-i.xxx | 備份文件并原處編輯 |
-s | 將多個文件視為獨立文件,而不是單個連續(xù)的長文件流 |
3.操作符
“操作”用于指定文件對操作的動作行為,也就是 sed 的命令。
通常情況下是采用的 “[n1[,n2]]” 操作參數(shù)的格式。n1、n2是可選的,代表選擇進行操作的行數(shù),如操作需要在5~20行之間進行,則表示為 “5,20 動作行為”
s | 替換,替換指定字符 |
d | 刪除,刪除選定的行 |
a | 增加,在當(dāng)前行下方增加一行指定內(nèi)容 |
i | 插入,在選定行上方插入一行指定內(nèi)容 |
c | 替換,將選定行替換為指定內(nèi)容 |
w | 保存模式匹配的行至指定文件 |
r | 讀取指定文件的文本至模式空間中匹配的行后 |
y | 字符轉(zhuǎn)換,轉(zhuǎn)換前后的字符長度必須相同 |
p | 打印行內(nèi)容。如果同時指定行,表示打印指定行;如果不指定行,則表示打印所有內(nèi)容;如果有非打印字符,則以ASCII碼輸出。其通常與"-n"選項一起使用 |
= | 打印行號 |
l(小寫L) | 打印數(shù)據(jù)流中的文本和不可打印的ASCII字符(如結(jié)束符$ 制表符\t) |
操作:
顯示第二行內(nèi)容
4.腳本格式
由 ‘地址+命令’ 組成
- ① 不給地址 對全文進行處理
- ② 單地址
數(shù)字 指定的數(shù)字行
$ 最后一行
- ③ 地址范圍
x,x 從第x行到第x行 3,6 從第3行到第6行
x,+x 從x行到+x行 3,+4 從3行到第7行
/pat1/,/pat2/ 第一個正則表達式和第二個正則表達式之間的行
- ④ 步進 ~
1~2 奇數(shù)行
2~2 偶數(shù)行
n;打印下一行
操作:
小問題:
如何打印一段時間間的日志
5.搜索替代
s/pattern/string/修飾符 查找替換,支持使用其它分隔符,可以是其它形式:s@@@,s### 替換修飾符: g 行內(nèi)全局替換 p 顯示替換成功的行 w /PATH/FILE 將替換成功的行保存至文件中 & 指代之前找到的內(nèi)容
指代變量
分組替換
sed -nr 's/正則匹配/\1/p'
還可以變換順序
操作:
取ip
①
②
或者
提取版本號
提取0644
6.變量
修改端口
修改網(wǎng)卡名
總結(jié)
到此這篇關(guān)于shell正則表達式、grep命令和sed命令舉例詳解的文章就介紹到這了,更多相關(guān)shell正則表達式grep命令和sed命令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
awk實現(xiàn)Left、join查詢、去除重復(fù)值以及局部變量講解例子
這篇文章主要介紹了awk實現(xiàn)Left、join查詢、去除重復(fù)值以及局部變量講解例子,awk的高級使用技巧,需要的朋友可以參考下2014-07-07Linux下查找后門程序 CentOS 查后門程序的shell腳本
這篇文章主要介紹了Linux下查找后門程序 CentOS 查后門程序的shell腳本,需要的朋友可以參考下2014-09-09