Linux系統(tǒng)中正則表達式詳解(含grep命令+實操案例)
前言
在Linux系統(tǒng)中,grep是最常用、最強大的文本搜索工具之一,核心功能是使用正則表達式(或普通字符串)搜索目標文本,并將匹配的行打印輸出。無論是日常排查日志、篩選配置文件,還是批量處理文本,grep都是必備工具。本文將從基礎用法、核心選項、正則表達式、grep命令族、通配符等方面,結合實操案例詳細講解grep的使用方法,新手也能快速上手。
一、grep命令基礎語法
grep命令的基本格式非常簡潔,核心由「選項+匹配模式+目標文件」三部分組成,語法如下:
grep [選項] [匹配模式] [文件...]
關鍵說明:
選項(可選):用于調整搜索行為,比如忽略大小寫、顯示行號等,下文會詳細列舉。
匹配模式(必填):可以是普通字符串、變量,也可以是正則表達式。注意:如果模式中包含空格,必須用雙引號("")將模式括起來,否則會被Shell解析為多個參數(shù)。
文件(必填):可以指定單個文件、多個文件,也可以使用通配符(如*.txt)匹配一批文件。
演示示例:
grep "root" test.txt
test.txt內容如下:
hello world helo linux hellllllo cloud Cloud Service 123abc測試文本 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 # 這是一行注釋內容 micky web service user certificate user login success ERROR: connection refused

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

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

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

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

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

