Linux系統(tǒng)中正則表達(dá)式詳解(含grep命令+實(shí)操案例)
前言
在Linux系統(tǒng)中,grep是最常用、最強(qiáng)大的文本搜索工具之一,核心功能是使用正則表達(dá)式(或普通字符串)搜索目標(biāo)文本,并將匹配的行打印輸出。無論是日常排查日志、篩選配置文件,還是批量處理文本,grep都是必備工具。本文將從基礎(chǔ)用法、核心選項(xiàng)、正則表達(dá)式、grep命令族、通配符等方面,結(jié)合實(shí)操案例詳細(xì)講解grep的使用方法,新手也能快速上手。
一、grep命令基礎(chǔ)語法
grep命令的基本格式非常簡潔,核心由「選項(xiàng)+匹配模式+目標(biāo)文件」三部分組成,語法如下:
grep [選項(xiàng)] [匹配模式] [文件...]
關(guān)鍵說明:
選項(xiàng)(可選):用于調(diào)整搜索行為,比如忽略大小寫、顯示行號(hào)等,下文會(huì)詳細(xì)列舉。
匹配模式(必填):可以是普通字符串、變量,也可以是正則表達(dá)式。注意:如果模式中包含空格,必須用雙引號(hào)("")將模式括起來,否則會(huì)被Shell解析為多個(gè)參數(shù)。
文件(必填):可以指定單個(gè)文件、多個(gè)文件,也可以使用通配符(如*.txt)匹配一批文件。
演示示例:
grep "root" test.txt
test.txt內(nèi)容如下:
hello world helo linux hellllllo cloud Cloud Service 123abc測(cè)試文本 xcb738 demo 4J973U data iivey program Iivey Code the book is good them are apples yes YES Yes B-Pk-y test admin@163.com JOOB test JOOOB linux JOOOOOB centos aaaa123ABC root:x:0:0:root:/root:/bin/bash nginx server start # 這是一行注釋內(nèi)容 micky web service user certificate user login success ERROR: connection refused

二、grep核心選項(xiàng)詳解(附案例)
grep的選項(xiàng)眾多,以下是日常工作中最常用的核心選項(xiàng),結(jié)合表格和實(shí)操案例說明,方便大家直接套用:
選項(xiàng) | 核心意義 | 實(shí)操案例 |
|---|---|---|
-c | 只輸出匹配行的數(shù)量,不顯示具體匹配內(nèi)容 | grep -c "root" /etc/passwd(統(tǒng)計(jì)/etc/passwd中包含root的行數(shù)) |
-i | 搜索時(shí)忽略大小寫,不區(qū)分大寫和小寫字母 | grep -i "linux" test.txt(匹配Linux、LINUX、linux等所有大小寫組合) |
-h | 查詢多個(gè)文件時(shí),不顯示匹配內(nèi)容所屬的文件名 | grep -h "error" *.log(搜索所有.log文件中的error,不顯示文件名) |
-l | 只列出包含匹配內(nèi)容的文件名,不顯示具體匹配行 | grep -l "test" /home/*(列出/home目錄下包含test的所有文件) |
-n | 顯示所有匹配行,并標(biāo)注該行在文件中的行號(hào)(非常實(shí)用) | grep -n "nginx" /etc/nginx/nginx.conf(顯示匹配nginx的行及行號(hào)) |
-s | 不顯示“文件不存在”或“無匹配內(nèi)容”的錯(cuò)誤信息,避免輸出冗余 | grep -s "test" a.txt b.txt(即使a.txt不存在,也不會(huì)報(bào)錯(cuò)) |
-v | 反向匹配:顯示不包含匹配模式的所有行(常用排查排除) | grep -v "^#" /etc/profile(過濾掉/etc/profile中以#開頭的注釋行) |
-w | 匹配整詞,避免部分匹配(比如匹配test,不會(huì)匹配test123、atest) | grep -w "test" test.txt(只匹配獨(dú)立的test單詞) |
-r | 遞歸搜索:不僅搜索當(dāng)前工作目錄,還會(huì)遞歸搜索所有子目錄下的文件 | grep -r "error" /var/log/(遞歸搜索/var/log目錄下所有包含error的文件) |
-E | 支持?jǐn)U展正則表達(dá)式(等價(jià)于egrep),無需對(duì)元字符轉(zhuǎn)義 | grep -E "a|b" test.txt(匹配包含a或b的行) |
-F | 不支持正則表達(dá)式,按照字符串字面意思匹配(等價(jià)于fgrep),速度更快 | grep -F "a*b" test.txt(匹配字面量a*b,不把*當(dāng)作元字符) |
補(bǔ)充案例(模式含空格的情況):
# 錯(cuò)誤用法:模式含空格,未加引號(hào),Shell會(huì)把 user 當(dāng)作匹配詞,certificate、test.txt 當(dāng)作文件 grep user certificate test.txt # 正確用法:匹配字符串包含空格,必須用雙引號(hào)包裹 grep "user certificate" test.txt
![]()
三、grep命令族詳解
Linux系統(tǒng)中,grep并非單一命令,而是一個(gè)“命令族”,包含三種常用形式,核心區(qū)別在于對(duì)正則表達(dá)式的支持程度,具體如下:
grep(標(biāo)準(zhǔn)grep):默認(rèn)支持基本正則表達(dá)式(BRE),部分元字符(如+、?、|等)需要用反斜杠(\)轉(zhuǎn)義才能生效。
grep "a\{2\}" test.txt # 匹配 aa![]()
egrep(擴(kuò)展grep):支持基本正則表達(dá)式和擴(kuò)展正則表達(dá)式(ERE),無需對(duì)擴(kuò)展元字符轉(zhuǎn)義,等價(jià)于
grep -E。
egrep "a+" test.txt # 匹配 a、aa、aaa

fgrep(快速grep):不支持任何正則表達(dá)式,僅按照字符串字面意思匹配,速度最快,等價(jià)于
grep -F。
fgrep "a*b" test.txt # 只匹配文本 a*b
![]()
總結(jié):日常使用中,若需使用擴(kuò)展正則,優(yōu)先用 grep -E(比egrep更通用);若只需匹配固定字符串,用 grep -F(速度更快)。
四、grep與正則表達(dá)式(核心重點(diǎn))
grep的強(qiáng)大之處在于支持正則表達(dá)式,正則表達(dá)式(簡稱RE)是由普通字符和元字符組成的字符串,用于精準(zhǔn)匹配文本模式。下面分「基礎(chǔ)正則」「擴(kuò)展正則」「POSIX字符類」三部分講解,結(jié)合案例更易理解。
4.1 正則表達(dá)式基礎(chǔ)
正則表達(dá)式由「普通字符」和「元字符」組成:
普通字符:無特殊含義,按字面意思匹配,如a、b、1、2、linux等。
元字符:被Shell賦予特殊含義,用于靈活匹配文本,如*、^、$、[]等(下文詳細(xì)說明)。
grep "hello" test.txt
![]()
一個(gè)完整的正則表達(dá)式,通常包含以下一種或多種元素:
字符集:僅包含普通字符,是最簡單的正則形式(如“linux”)。
錨:指定匹配內(nèi)容在文本行中的位置(如行首、行尾)。
修飾符:擴(kuò)大或縮小匹配范圍(如重復(fù)次數(shù)、轉(zhuǎn)義)。
grep "^abc" test.txt
![]()
4.2 基礎(chǔ)正則元字符(grep默認(rèn)支持)
以下是grep默認(rèn)支持的基礎(chǔ)正則元字符,每一個(gè)都配實(shí)操案例,方便直接測(cè)試:
元字符 | 核心意義 | 案例說明 |
|---|---|---|
* | 匹配前面的普通字符0次或多次 | hel*o:匹配heo(l出現(xiàn)0次)、helo(l出現(xiàn)1次)、hello(l出現(xiàn)2次)等 |
. | 匹配任意一個(gè)字符(除了換行符) | ...73.:匹配前3個(gè)任意字符、中間為73、最后1個(gè)任意字符(如xcb738、4J973U) |
^ | 匹配行首,即行的第一個(gè)字符是^后面的字符 | ^cloud:匹配所有以cloud開頭的行;^$:匹配空白行(無任何字符) |
$ | 匹配行尾,即行的最后一個(gè)字符是$前面的字符 | micky$:匹配所有以micky結(jié)尾的行 |
[] | 匹配中括號(hào)內(nèi)的任意一個(gè)字符;^在括號(hào)內(nèi)表示取反 | 1. [xyz]:匹配x、y、z中的任意一個(gè);2. [c-n]:匹配c到n之間的任意字符;3. [^b-d]:匹配b到d之外的任意字符 |
\ | 轉(zhuǎn)義符:屏蔽元字符的特殊含義,使其按字面意思匹配 | \$:匹配字面量$(不表示行尾);\\:匹配字面量\ |
\<\> | 精確匹配單詞邊界(需轉(zhuǎn)義),僅匹配獨(dú)立的單詞 | \<the\>:匹配獨(dú)立的the,不匹配them、there、other等 |
\{}系列 | 匹配前面字符的指定重復(fù)次數(shù)(需轉(zhuǎn)義) | 1. \{n\}:匹配n次(如JO\{3\}B:匹配JOOOB);2. \{n,\}:至少匹配n次;3. \{n,m\}:匹配n到m次 |
實(shí)操案例:
# 匹配包含5個(gè)小寫字母的行
grep "[a-z]\{5\}" test.txt 
# 匹配不包含小寫字母的行 grep "[^a-z]" test.txt

# 精確匹配單詞iivey grep "\<iivey\>" test.txt
![]()
4.3 擴(kuò)展正則元字符(需加-E選項(xiàng))
擴(kuò)展正則元字符在基礎(chǔ)正則的基礎(chǔ)上增加了更靈活的匹配規(guī)則,需使用 grep -E(或egrep)才能支持,無需對(duì)元字符轉(zhuǎn)義,具體如下:
元字符 | 核心意義 | 案例說明 |
|---|---|---|
? | 匹配前面的普通字符0次或1次(區(qū)別于*,不能匹配多次) | grep -E "iivey?" exp1.txt(匹配iivey或iive) |
+ | 匹配前面的普通字符1次或多次(區(qū)別于*,不能匹配0次) | grep -E "hel+o" test.txt(匹配helo、hello等,不匹配heo) |
() | 括起一組正則表達(dá)式,作為一個(gè)整體匹配 | grep -E "(ab)+" test.txt(匹配ab、abab、ababab等) |
| | “或”操作符,匹配多個(gè)選項(xiàng)中的任意一個(gè) | grep -E "a|b|c" test.txt(匹配包含a、b或c的行) |
grep -E "cat|dog" test.txt
![]()
4.4 POSIX字符類(適配多字符編碼)
為了保持不同國家字符編碼的一致性,POSIX(可移植操作系統(tǒng)接口)定義了特殊的字符類,格式為 [:classname:],grep完全支持,使用時(shí)需用引號(hào)或雙中括號(hào)([[ ]])引起來。
POSIX字符類 | 等價(jià)寫法 | 核心意義 |
|---|---|---|
[:upper:] | [A-Z] | 匹配所有大寫英文字母 |
[:lower:] | [a-z] | 匹配所有小寫英文字母 |
[:digit:] | [0-9] | 匹配所有阿拉伯?dāng)?shù)字 |
[:alnum:] | [0-9a-zA-Z] | 匹配所有大小寫字母和阿拉伯?dāng)?shù)字 |
[:space:] | 無 | 匹配空格或Tab鍵 |
[:alpha:] | [a-zA-Z] | 匹配所有大小寫英文字母 |
[:xdigit:] | [0-9A-Fa-f] | 匹配所有16進(jìn)制數(shù)字 |
實(shí)操案例:
# 匹配包含數(shù)字的行 grep '[[:digit:]]' test.txt

# 匹配包含大寫字母的行 grep '[[:upper:]]' test.txt

五、通配符(globbing)與正則元字符的區(qū)別
很多新手會(huì)混淆「通配符」和「正則元字符」,兩者的核心區(qū)別的是:通配符用于匹配文件名,正則元字符用于匹配文本內(nèi)容。
通配符(globbing)是將包含通配符的非具體文件名,擴(kuò)展為一批具體文件名的過程,常用通配符及含義如下(與正則元字符含義不同):
*:匹配任意位數(shù)的任意字符(區(qū)別于正則中的“重復(fù)匹配”)。?:匹配任意一位字符(區(qū)別于正則中的“0次或1次匹配”)。^:在通配符中表示“取反”(區(qū)別于正則中的“行首匹配”)。[]:匹配中括號(hào)內(nèi)的任意一個(gè)字符(與正則中[]含義一致)。{}:匹配括號(hào)內(nèi)的任意一個(gè)字符串(批量匹配)。
實(shí)操案例(通配符常用場景):
# 列出當(dāng)前目錄下所有.sh后綴的文件(*匹配任意字符)
ls -l *.sh
# 列出當(dāng)前目錄下以mytest開頭、后面跟1個(gè)任意字符、.sh結(jié)尾的文件
ls -l mytest?.sh
# 列出當(dāng)前目錄下以e或m開頭、任意后綴(非.sh)的文件
ls [em]*.[^sh]*
# 列出當(dāng)前目錄下以m或b開頭、.sh結(jié)尾的文件({}批量匹配)
ls {m,b}*.sh
# 批量創(chuàng)建1.doc到10.doc的文件
mkdir {1..10}.doc六、常見實(shí)操場景匯總(必看)
結(jié)合前面的知識(shí)點(diǎn),整理幾個(gè)日常工作中最常用的grep實(shí)操場景,直接復(fù)制即可使用:
1.過濾配置文件注釋行(排除#開頭和空白行):
grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"
2.遞歸搜索日志中的錯(cuò)誤信息,并顯示行號(hào):
grep -rn "error" /var/log/nginx/
3.統(tǒng)計(jì)日志中包含“success”的行數(shù)(忽略大小寫):
grep -ci "success" /var/log/access.log
4.匹配包含數(shù)字或大寫字母的行:
grep -E '[[:digit:]]|[[:upper:]]' test.txt
5.列出當(dāng)前目錄及子目錄下,包含“test”的所有文件:
grep -rl "test" ./
七、常見易錯(cuò)點(diǎn)總結(jié)
模式含空格時(shí),必須用雙引號(hào)括起來,否則Shell會(huì)解析錯(cuò)誤。
基礎(chǔ)正則中,+、?、|、()等元字符需轉(zhuǎn)義(\),擴(kuò)展正則(grep -E)無需轉(zhuǎn)義。
通配符和正則元字符含義不同:通配符匹配文件名,正則匹配文本內(nèi)容。
-r選項(xiàng)是遞歸搜索目錄,不是遞歸匹配文本內(nèi)容;-w選項(xiàng)是匹配整詞,不是匹配單詞的一部分。
POSIX字符類需用引號(hào)或雙中括號(hào)引起來,否則無法生效。
總結(jié):grep命令的核心是“匹配模式”,掌握正則表達(dá)式和常用選項(xiàng),就能靈活應(yīng)對(duì)各種文本搜索場景。建議大家結(jié)合本文案例,實(shí)際操作測(cè)試,加深記憶。如果有其他用法或疑問,歡迎在評(píng)論區(qū)補(bǔ)充交流~
到此這篇關(guān)于Linux系統(tǒng)中正則表達(dá)式詳解(含grep命令+實(shí)操案例)的文章就介紹到這了,更多相關(guān)Linux正則表達(dá)式grep命令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解表單驗(yàn)證正則表達(dá)式實(shí)例(推薦)
這篇文章主要介紹了詳解表單驗(yàn)證正則表達(dá)式實(shí)例(推薦)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,特此分享到腳本之家平臺(tái)供大家參考2016-05-05
用Java正則去掉字符串中重復(fù)出現(xiàn)的字符
abcde 順序可以不一樣,也就是去掉重復(fù)出現(xiàn)的字符2010-12-12
PHP html標(biāo)簽正則替換并可自定義正則規(guī)則
PHP有個(gè)去除HTML標(biāo)簽的函數(shù)strip_tags,不過對(duì)于某些特殊符號(hào)不好使,下面這個(gè)函數(shù)的功能非常強(qiáng)大,同時(shí)用戶還可以根據(jù)自己的需要進(jìn)行正則替換.2010-05-05
JScript中正則表達(dá)函數(shù)的說明與應(yīng)用
JScript中正則表達(dá)函數(shù)的說明與應(yīng)用...2007-04-04
Java使用正則表達(dá)式對(duì)注冊(cè)頁面進(jìn)行驗(yàn)證功能實(shí)現(xiàn)
本文給大家分享一段有關(guān)java使用正則表達(dá)式對(duì)注冊(cè)頁面進(jìn)行驗(yàn)證的代碼,代碼比較簡單,非常不錯(cuò),感興趣的朋友一起學(xué)習(xí)吧2016-09-09

