最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux grep 命令從正則表達(dá)式到性能優(yōu)化深度解析

 更新時(shí)間:2026年05月12日 10:53:02   作者:劍神一笑  
這篇文章給大家介紹Linux grep 命令從正則表達(dá)式到性能優(yōu)化的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

grep 的三種變體

很多人不知道,grep 其實(shí)有三個(gè)版本:

# 基礎(chǔ)正則表達(dá)式 (Basic Regular Expression)
grep 'pattern' file.txt
# 擴(kuò)展正則表達(dá)式 (Extended Regular Expression)
grep -E 'pattern' file.txt  # 等同于 egrep
# Perl 兼容正則表達(dá)式 (Perl-Compatible Regular Expression)
grep -P 'pattern' file.txt

關(guān)鍵差異在元字符支持:

元字符grepgrep -Egrep -P
+???
????
``??
()???
\d???
\w???

實(shí)戰(zhàn)建議:默認(rèn)用 grep -E,需要高級(jí)特性(如 \d、\w)時(shí)用 grep -P。

正則表達(dá)式實(shí)戰(zhàn)技巧

1. 郵箱匹配的演進(jìn)

# ? 錯(cuò)誤:基礎(chǔ)正則不支持 +
grep '@.*\.' emails.txt
# ? 正確:擴(kuò)展正則
grep -E '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' emails.txt
# ? 更簡(jiǎn)潔:Perl 正則
grep -P '[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,}' emails.txt

2. 行首行尾陷阱

# 匹配以 error 開頭的行
grep '^error' log.txt
# 匹配以 error 結(jié)尾的行
grep 'error$' log.txt
# ? 常見錯(cuò)誤:多行模式下 ^ $ 行為不同
echo -e "first\nsecond\nthird" | grep -z '^second'
# -z 將換行符視為 null,^second 匹配不到(因?yàn)?second 不在行首)

3. 單詞邊界匹配

# 匹配 error 作為一個(gè)完整單詞
grep -w 'error' log.txt  # 等同于 grep '\berror\b' log.txt
# 實(shí)戰(zhàn):過濾掉 errorHandler、errorLog 等包含 error 的詞
grep -w 'error' log.txt | grep -v 'errorHandler'

性能優(yōu)化:從 5 分鐘到 3 秒

回到開頭的問題,2GB 日志文件搜索優(yōu)化:

1. 禁用顏色和行號(hào)

# ? 慢:每次匹配都計(jì)算行號(hào)和著色
grep -n --color=always "ERROR" app.log
# ? 快:禁用額外處理
grep "ERROR" app.log

性能對(duì)比(2GB 文件):

選項(xiàng)耗時(shí)
默認(rèn)3.2s
-n4.8s
--color=always6.1s
-n --color=always8.5s

2. 使用固定字符串匹配

# ? 慢:正則引擎解析
grep 'ERROR' app.log
# ? 快:固定字符串匹配(跳過正則解析)
grep -F 'ERROR' app.log

對(duì)于簡(jiǎn)單字符串,-F 能提升 30-50% 性能。

3. 并行處理

# 單線程
grep "ERROR" huge.log
# 多線程(利用所有 CPU 核心)
parallel -j $(nproc) 'grep "ERROR" {} >> errors.txt' ::: $(split -n l/$(nproc) huge.log)

4. 只匹配文件名

# ? 慢:輸出所有匹配行
grep -r "TODO" ./src/
# ? 快:只輸出文件名
grep -rl "TODO" ./src/

高級(jí)用法實(shí)戰(zhàn)

1. 上下文匹配

# 顯示匹配行及前后 2 行(排查錯(cuò)誤上下文)
grep -C 2 "NullPointerException" app.log
# 只顯示前面 2 行
grep -B 2 "Exception" app.log
# 只顯示后面 2 行
grep -A 2 "Exception" app.log

2. 統(tǒng)計(jì)匹配次數(shù)

# 統(tǒng)計(jì)每個(gè)文件中 ERROR 出現(xiàn)次數(shù)
grep -c "ERROR" *.log
# 輸出示例:
# app.log:1523
# system.log:89
# access.log:0

3. 反向匹配

# 排除注釋行
grep -v '^#' config.conf
# 排除空行和注釋
grep -v -E '^#|^$' config.conf

4. 遞歸搜索

# 遞歸搜索所有 .js 文件
grep -r --include="*.js" "console.log" ./src/
# 排除 node_modules
grep -r --exclude-dir="node_modules" "import" ./src/

常見陷阱

1. 特殊字符轉(zhuǎn)義

# ? 錯(cuò)誤:. 匹配任意字符
grep 'app.log' file.txt  # 會(huì)匹配 appblog、appclog 等
# ? 正確:轉(zhuǎn)義 .
grep 'app\.log' file.txt

2. 空格處理

# ? 錯(cuò)誤:空格分隔會(huì)被視為多個(gè)文件
grep error log file.txt  # 搜索 error,文件是 log 和 file.txt
# ? 正確:引號(hào)包裹
grep 'error log' file.txt

3. 二進(jìn)制文件

# grep 默認(rèn)跳過二進(jìn)制文件,但有時(shí)需要搜索
grep -a "pattern" binary_file.bin  # -a 將二進(jìn)制文件視為文本

實(shí)戰(zhàn)案例:日志分析腳本

#!/bin/bash
# 分析 Nginx 訪問日志,統(tǒng)計(jì) 5xx 錯(cuò)誤
LOG_FILE="/var/log/nginx/access.log"
OUTPUT="errors_$(date +%Y%m%d).txt"
# 1. 篩選 5xx 狀態(tài)碼
# 2. 提取 IP、時(shí)間、URL、狀態(tài)碼
# 3. 按狀態(tài)碼分組統(tǒng)計(jì)
grep -E '" 5[0-9]{2} ' "$LOG_FILE" | \
  awk '{print $1, $4, $7, $9}' | \
  sort | uniq -c | sort -rn > "$OUTPUT"
echo "分析完成,結(jié)果保存到 $OUTPUT"

grep vs ripgrep

最后提一下 ripgrep (rg),Rust 實(shí)現(xiàn)的現(xiàn)代替代品:

# grep 遞歸搜索
grep -r --include="*.js" "pattern" ./src/
# ripgrep 默認(rèn)遞歸,自動(dòng)過濾 .gitignore
rg -tjs "pattern" ./src/

ripgrep 優(yōu)勢(shì):

  • 默認(rèn)遞歸搜索
  • 自動(dòng)尊重 .gitignore
  • 自動(dòng)跳過二進(jìn)制文件
  • 性能提升 5-10 倍
  • Unicode 支持

但 grep 仍是服務(wù)器標(biāo)配,掌握它很有必要。

到此這篇關(guān)于Linux grep 命令從正則表達(dá)式到性能優(yōu)化深度解析的文章就介紹到這了,更多相關(guān)Linux grep 命令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析正則表達(dá)式-替換原則(.NET) 圖文

    淺析正則表達(dá)式-替換原則(.NET) 圖文

    最近經(jīng)常用到替換的東西所以就出來整理下,這里要分享的是正則表達(dá)式里面的替換原則,首先要聲明的是這里提及到的替換原則是.NET里面的正則表達(dá)式的替換原則
    2016-05-05
  • JavaScript基于正則表達(dá)式的數(shù)字判斷函數(shù)

    JavaScript基于正則表達(dá)式的數(shù)字判斷函數(shù)

    JavaScript基于正則表達(dá)式的數(shù)字判斷函數(shù),需要的朋友可以參考下。
    2011-01-01
  • javascript之正則表達(dá)式基礎(chǔ)知識(shí)小結(jié)

    javascript之正則表達(dá)式基礎(chǔ)知識(shí)小結(jié)

    javascript之正則表達(dá)式基礎(chǔ)知識(shí)小結(jié),對(duì)于學(xué)習(xí)正則表達(dá)式的朋友是個(gè)不錯(cuò)的基礎(chǔ)入門資料。
    2010-04-04
  • 8個(gè)你應(yīng)該了解的正則表達(dá)式提高你的工作效率

    8個(gè)你應(yīng)該了解的正則表達(dá)式提高你的工作效率

    正則表達(dá)式也可以被當(dāng)作是一門語言,入門時(shí)可能很吃力,不過一旦學(xué)會(huì)了就方便很多,在處理一些比較復(fù)雜的替換時(shí),正則表達(dá)式就會(huì)發(fā)揮它的真正作用,本文整理了一些常用的正則,感興趣的朋友可以了解下,或許對(duì)你有所幫助
    2013-01-01
  • 正則基礎(chǔ)之?捕獲組(capture?group)

    正則基礎(chǔ)之?捕獲組(capture?group)

    捕獲組就是把正則表達(dá)式中子表達(dá)式匹配的內(nèi)容,保存到內(nèi)存中以數(shù)字編號(hào)或顯式命名的組里,方便后面引用,這里就為大家簡(jiǎn)單介紹一下
    2023-05-05
  • 正則表達(dá)式問號(hào)的四種用法詳解

    正則表達(dá)式問號(hào)的四種用法詳解

    這篇文章主要介紹了正則表達(dá)式問號(hào)的四種用法詳解的相關(guān)資料,需要的朋友可以參考下
    2015-09-09
  • 淺談js正則字面量//與new RegExp的執(zhí)行效率

    淺談js正則字面量//與new RegExp的執(zhí)行效率

    以前看到很多文章都說 字面量 會(huì)比 new 對(duì)象 形式效率高,但是在正則這里,好像不是這么回事,具體的請(qǐng)看下面的分析
    2020-04-04
  • 正則表達(dá)式的語法

    正則表達(dá)式的語法

    正則表達(dá)式(regular expression)描述了一種字符串匹配的模式,可以用來檢查一個(gè)串是否含有某種子串、將匹配的子串做替換或者從某個(gè)串中取出符合某個(gè)條件的子串等
    2006-09-09
  • 論壇UBB代碼 推薦

    論壇UBB代碼 推薦

    論壇UBB代碼 推薦...
    2006-07-07
  • javascript正則表達(dá)式簡(jiǎn)介

    javascript正則表達(dá)式簡(jiǎn)介

    正則表達(dá)式就是一個(gè)用來描述字符模式的對(duì)象。它被用來在文本中執(zhí)行模式匹配(pattern-matching)以及”查找-替換”(search-and-replace)的任務(wù)。javascript中正則的風(fēng)格類似Perl中正則的風(fēng)格。
    2015-05-05

最新評(píng)論

潞城市| 台中市| 彰化市| 邯郸县| 当雄县| 城口县| 三江| 方城县| 托克托县| 崇信县| 博客| 招远市| 筠连县| 南木林县| 天长市| 奉新县| 马鞍山市| 宜宾县| 怀集县| 二手房| 师宗县| 蓬溪县| 禹城市| 鹤峰县| 绥江县| 东明县| 太原市| 彭阳县| 望城县| 吴桥县| 来凤县| 读书| 青海省| 木里| 安丘市| 鄯善县| 祁门县| 虞城县| 白玉县| 油尖旺区| 黑山县|