Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux grep 正則表達式與常用選項完整速查手冊

編輯:Linux 教學

grep 核心語法

grep [選項] PATTERN [FILE...]
grep [選項] -e PATTERN1 -e PATTERN2 [FILE...]
grep [選項] -f pattern_file [FILE...]

一、基礎正則表達式 (BRE) 元字符

grep 默認使用 **基礎正則 (BRE)**,元字符需轉義才具特殊含義;加 `-E` 或用 `egrep` 切換至 **擴展正則 (ERE)**,元字符無需轉義。

元字符BRE 寫法ERE 寫法含義範例匹配
行首^^錨定行首`^root` 匹配以 root 開頭的行
行尾$$錨定行尾`bash$` 匹配以 bash 結尾的行
任意單字符..除換行外任意字符`c.t` 匹配 cat, cut, c9t
零次或多次\**前一字符重複 0~n 次`ab*c` 匹配 ac, abc, abbc, abbbc
字符集合[...][...]匹配括號內任一字符`[Cc]at` 匹配 Cat 或 cat
排除字符集[^...][^...]匹配非括號內字符`[^0-9]` 匹配非數字字符
詞首邊界\<\b單詞開始位置`\
詞尾邊界\>\b單詞結束位置`root\>` 匹配 root, groot 不匹配 roots
分組捕獲\(...\)(...)子模式分組,可反向引用`\(ab\)\1` 匹配 abab
反向引用\1 ~ \9\1 ~ \9引用前面分組內容同上
指定次數\{m,n\}{m,n}前一元素重複 m~n 次`a\{3,5\}` 匹配 aaa, aaaa, aaaaa
或運算不支援\|多模式任一匹配`cat|dog` 匹配 cat 或 dog
一次或多次不支援+前一元素 1~n 次`ab+c` 匹配 abc, abbc...
零次或一次不支援?前一元素 0~1 次`ab?c` 匹配 ac, abc

二、常用選項速查

選項長選項功能典型場景
-i--ignore-case忽略大小寫`grep -i error log`
-v--invert-match反向匹配 (顯示不匹配行)`grep -v ^# config` 排除註釋行
-n--line-number顯示行號`grep -n TODO *.c`
-c--count僅輸出匹配行數`grep -c "failed" auth.log`
-l--files-with-matches僅列出匹配的文件名`grep -r -l "API_KEY" .`
-L--files-without-match列出不匹配的文件名`grep -L "license" *.txt`
-r / -R--recursive遞歸搜尋目錄 (-R 跟隨符號鏈接)`grep -r "pattern" /etc`
-w--word-regexp全詞匹配 (邊界 \b)`grep -w root /etc/passwd`
-x--line-regexp整行匹配`grep -x "export PATH=..."`
-A NUM--after-context顯示匹配行後 NUM 行`grep -A 3 "ERROR" log`
-B NUM--before-context顯示匹配行前 NUM 行`grep -B 2 "Exception" log`
-C NUM--context顯示匹配行前後各 NUM 行`grep -C 5 "CRITICAL" log`
--color=auto高亮匹配文本 (默認開啟)別名 `alias grep='grep --color=auto'`
-E--extended-regexp使用擴展正則 (ERE)`grep -E "cat|dog" file`
-P--perl-regexp使用 Perl 相容正則 (PCRE)`grep -P "\d{4}-\d{2}-\d{2}"`
-F--fixed-strings字面字串匹配 (無正則)`grep -F "error.code=500" log`
-f FILE--file從文件讀取模式 (每行一模式)`grep -f patterns.txt target.log`
-o--only-matching僅輸出匹配部分 (非整行)`grep -oE "\d{1,3}(\.\d{1,3}){3}" log` 提取 IP
-h--no-filename多文件時不顯示文件名`grep -h pattern file1 file2`
-H--with-filename強制顯示文件名 (單文件時)`grep -H pattern file`
-a--text將二進制文件視為文本處理`grep -a "string" binary.bin`
-z--null-data以 NUL (\0) 分隔行 (配合 find -print0)`grep -z "pattern" file`

三、實戰高頻組合招

1. 排除多個目錄/文件 (正確轉義管道符)

# 錯誤:管道符未轉義,被 shell 解析
grep -r "UserService" . | grep -v "svn|test|auto_load"

# 正確:grep -E 內部使用 \| 或用 grep -v 多次管道
grep -r "UserService" . | grep -v -E "svn|test|auto_load"
# 或
grep -r "UserService" . | grep -v "svn" | grep -v "test" | grep -v "auto_load"

# 更優雅:單一 grep 完成 (需 GNU grep 支援 -E 和排除目錄)
grep -r -E "UserService" . --exclude-dir={.svn,.git,test,auto_load}

2. 提取 IP 地址 / 郵箱 / 域名

# IPv4 (PCRE 最精準)
grep -oP '\b(?:\d{1,3}\.){3}\d{1,3}\b' access.log

# 郵箱
grep -oE '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' file

# 域名
grep -oE '\b(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}\b' file

3. 多文件上下文關聯

# 顯示匹配行及前後 3 行,含文件名與行號
grep -rn -C 3 "FATAL" /var/log/

# 統計各文件匹配次數
grep -rc "ERROR" /var/log/ | sort -t: -k2 -nr

4. 結合 find 精準範圍

# 僅搜尋 .c/.h 文件
find . -name "*.c" -o -name "*.h" | xargs grep -n "TODO"

# 避免參數過長
find . -name "*.log" -print0 | xargs -0 grep "CRITICAL"

四、效能優化技巧

  • 固定字串用 -F:關閉正則引擎,速度提升 10 倍以上。
  • 大文件用 --mmap:記憶體映射讀取 (自動啟用)。
  • 避免 .\* 貪婪匹配:改用 `[^"]*` 等具體字符集。
  • LC_ALL=C:關閉 locale 處理,純 ASCII 搜尋加速。
    LC_ALL=C grep -r "pattern" .
  • 並行搜尋:`grep -r` 單執行緒;大規模代碼庫可用 `ripgrep (rg)`、`ag (silver searcher)` 替代,支援多執行緒、.gitignore 自動排除。

結語

grep 是文本處理瑞士軍刀。熟記 BRE/ERE/PCRE 三種模式差異、掌握 `-v/-o/-A/-B/-C/-r/-w/-F/-E/-P` 高頻選項組合、善用 `--exclude-dir` 與 `LC_ALL=C` 優化,能解決 95% 日誌分析、代碼搜尋、配置檢查需求。複雜提取任務請轉向 `awk`、`sed` 或 `ripgrep`。

Copyright © Windows教程網 All Rights Reserved