正則表達式與grep文本過濾詳解

文章目錄

  • 前言
  • 一、正則表達式概述
    • 1.1 定義
    • 1.2 主要用途
    • 1.3 Linux 中的正則表達式分類
      • 1.3.1 基礎正則表達式(BRE)
      • 1.3.2 擴展正則表達式(ERE)
  • 二、正則表達式的基本組成
    • 2.1 普通字符
    • 2.2 元字符
      • 2.2.1 基本元字符
      • 2.2.2 重復次數相關
      • 2.2.3 擴展正則中的元字符(ERE)
      • 2.2.4 `egrep`的用法
  • 三、grep 工具的使用
    • 3.1 常用選項
    • 3.2 使用示例
  • 四、正則表達式操作案例
    • 4.1 查找特定字符
    • 4.2 使用中括號集合
    • 4.3 使用定位符
    • 4.4 使用點與星號
    • 4.5 使用次數限定符
  • 五、基礎正則與擴展正則對比表
  • 總結
    • 🎯 核心價值
    • 📊 體系結構
    • ? 四大核心能力
    • 🛠? 實戰應用


前言

你是否曾在成百上千行的日志文件中尋找某個關鍵錯誤信息,卻像大海撈針一樣無從下手?是否曾需要從雜亂的文本中快速提取電話號碼、郵箱地址或特定格式的數據,卻不得不手動逐行篩選?別擔心,正則表達式正是為你解決這些問題而生的“文本處理瑞士軍刀”。它就像是一套神奇的密碼,掌握了它,你就能讓計算機自動理解你想要的文本模式,無論是篩選日志、解析數據還是批量處理文檔,都將變得輕松高效。本章將帶你從零開始,解鎖這項讓無數程序員和系統管理員受益終身的強大技能。


一、正則表達式概述

1.1 定義

正則表達式(Regular Expression,常縮寫為 regex/regexp/RE)是一種用于描述字符串模式的規則。它能夠高效地進行檢索替換過濾符合特定規則的字符串。

1.2 主要用途

  • 系統日志篩選(如定位“登錄失敗”“服務啟動失敗”等關鍵信息)
  • 配置文件解析與提取
  • 文本查找與替換
  • 腳本編程中的條件匹配與驗證

1.3 Linux 中的正則表達式分類

類型名稱特點需轉義字符常用工具
BRE基礎正則表達式功能有限,傳統語法\{n\}, \+, \?, \(\), |grep, sed
ERE擴展正則表達式功能強大,語法簡潔無需轉義grep -E, egrep, awk

1.3.1 基礎正則表達式(BRE)

  • 語法較為傳統,功能相對有限
  • 量詞如 {} 需轉義為 \{n,m\}
  • +?() 等符號也需要轉義
  • 常用工具:grepsed

1.3.2 擴展正則表達式(ERE)

  • 功能更強大,語法更簡潔
  • +?(){}| 等符號無需轉義
  • 常用工具:egrep(或 grep -E)、awk

二、正則表達式的基本組成

2.1 普通字符

包括字母、數字、標點符號等,匹配其本身。

2.2 元字符

2.2.1 基本元字符

  • .:匹配任意單個字符(除換行符 \r\n
  • []:匹配字符集合中的一個字符,如 [abc][a-z][0-9A-Z]
  • [^]:匹配不在集合中的任意一個字符,如 [^a-z] 表示非小寫字母
  • ^:匹配行首
  • $:匹配行尾
  • \:轉義符,用于取消元字符的特殊含義

2.2.2 重復次數相關

  • *:匹配前一個字符 0 次或多次
  • \+:匹配前一個字符至少 1 次(BRE 中需轉義)
  • \{n\}:匹配前一個字符恰好 n 次
  • \{n,m\}:匹配前一個字符 n 到 m 次
  • \{n,\}:匹配前一個字符至少 n 次

2.2.3 擴展正則中的元字符(ERE)

  • +:匹配前一個字符至少 1 次(無需轉義)
  • ?:匹配前一個字符 0 次或 1 次
  • |:表示“或”關系,匹配多個模式之一
  • ():用于分組,可對一組字符進行重復或選擇
  • ()+:匹配重復的組

2.2.4 egrep的用法

egrep 是 Unix/Linux 系統中的一個文本搜索工具,屬于 GNU grep 的擴展版本(grep -E 的別名)。它支持擴展正則表達式(Extended Regular Expressions, ERE),比基礎正則表達式(BRE)提供更靈活的語法,例如直接使用 +、?、| 等元字符而無需轉義。
基本量詞語法

  • egrepawk使用{n}{n,}{n,m}進行匹配時,{}前無需加轉義符\
  • 示例:
    egrep -E -n 'wo{2}d' demo    # 匹配"wood"
    egrep -E -n 'wo{2,3}d' demo  # 匹配"wood"或"woood"
    

常用量詞操作符

  • + 重復一個或多個前導字符

    • 示例:egrep -n 'wo+d' demo 匹配"wood"、“woood”、"woooooood"等字符串
  • ? 零個或一個前導字符

    • 示例:egrep -n 'bes?t' demo 匹配"bet"和"best"
  • | 或操作(匹配多個模式)

    • 示例:egrep -n 'of|is|on' demo 匹配"of"、“if"或"on”
  • () 分組匹配

    • 示例:egrep -n 't(a|e)st' demo
      匹配"tast"和"test",利用分組將共有的"t"和"st"提取,僅將差異部分"a|e"放入組內
  • ()+ 重復分組匹配

    • 示例:egrep -n 'A(xyz)+C' demo
      匹配以"A"開頭、"C"結尾,中間包含一個或多個"xyz"的字符串

三、grep 工具的使用

3.1 常用選項

選項功能說明使用示例
-E啟用擴展正則表達式grep -E 'wo{2}d' file
-c統計匹配行數grep -c root /etc/passwd
-i忽略大小寫grep -i "the" file
-o只輸出匹配內容grep -o '[0-9]\+' file
-v反向匹配(排除)grep -v root /etc/passwd
-n顯示行號grep -n pattern file
--color=auto高亮顯示匹配內容grep --color=auto pattern file

3.2 使用示例

grep -c root /etc/passwd          # 統計包含 root 的行數
grep -i "the" web.sh              # 忽略大小寫匹配 the
grep -v root /etc/passwd          # 輸出不包含 root 的行
ipconfig | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1  # 提取 IP 地址
  • -c
    在這里插入圖片描述
  • -i
    在這里插入圖片描述
  • -v
    在這里插入圖片描述
  • -o
    在這里插入圖片描述

四、正則表達式操作案例

元字符功能說明示例匹配結果
.匹配任意單個字符(除\r\n)w..dwood, word, w00d
[ ]匹配字符集合中的任意一個字符sh[io]rtshirt, short
[^ ]匹配不在集合中的任意一個字符[^w]oofoo, boo(排除woo)
^匹配行首位置^the以the開頭的行
$匹配行尾位置\.$以.結尾的行
\轉義特殊字符a\.ba.b(而不是ajb等)

4.1 查找特定字符

grep -n 'the' demo        # 查找包含 the 的行
grep -vn 'the' demo       # 查找不包含 the 的行

請添加圖片描述

4.2 使用中括號集合

grep -n 'sh[io]rt' demo   # 匹配 shirt 或 short
grep -n '[^w]oo' demo     # 匹配開頭不是 w 且包含 oo 的行

在這里插入圖片描述

4.3 使用定位符

grep -n '^the' demo       # 匹配以 the 開頭的行
grep -n '\.$' demo        # 匹配以 . 結尾的行
grep -n '^$' demo         # 匹配空行

在這里插入圖片描述

4.4 使用點與星號

grep -n 'w..d' demo       # 匹配 w 開頭、d 結尾,中間兩個任意字符
grep -n 'woo*d' demo      # 匹配 w 開頭、d 結尾,中間有 0 個或多個 o
grep -n 'w.*d' demo       # 匹配 w 開頭、d 結尾,中間任意多個字符
grep -n '[0-9][0-9]*' demo # 匹配任意數字

在這里插入圖片描述

4.5 使用次數限定符

grep -n 'o\{2\}' demo           # 匹配兩個連續的 o
grep -n 'wo\{2,5\}d' demo       # 匹配 w 開頭、d 結尾,中間 2~5 個 o
grep -n 'wo\{2,\}d' demo        # 匹配 w 開頭、d 結尾,中間至少 2 個 o

在這里插入圖片描述


五、基礎正則與擴展正則對比表

量詞功能說明BRE語法ERE語法示例
*匹配0次或多次**wo*d(wd, wod, wood)
+匹配1次或多次\++wo\+d(wod, wood)
?匹配0次或1次\??bes?t(bet, best)
{n}匹配恰好n次\{n\}{n}o\{2\}(oo)
{n,}匹配至少n次\{n,\}{n,}o\{2,\}(oo, ooo, …)
{n,m}匹配n到m次\{n,m\}{n,m}o\{2,5\}(oo, ooo, oooo, ooooo)

總結

🎯 核心價值

正則表達式是文本處理的瑞士軍刀,通過模式匹配實現高效檢索、替換和過濾,極大提升數據處理效率。

📊 體系結構

兩大體系并行:

  • BRE(基礎正則):傳統嚴謹,需轉義特殊字符
  • ERE(擴展正則):現代簡潔,直接使用元字符

? 四大核心能力

  1. 精準定位 - 用 ^ $ 鎖定行首行尾
  2. 字符控制 - 用 [ ] [^ ] 精確字符范圍
  3. 數量調控 - 用 * + ? {} 控制出現次數
  4. 邏輯組合 - 用 | () 實現復雜邏輯匹配

🛠? 實戰應用

grepawksed等結合使用,可以處理99%的文檔

  • 日志分析:快速定位錯誤信息 grep -n "error" logfile
  • 數據提取:匹配特定格式 grep -o '[0-9]\{3\}-[0-9]\{2\}-[0-9]\{4\}'
  • 文本清洗:過濾空行 grep -v '^$' file
  • 模式驗證:檢查格式合法性 grep -E '^[A-Za-z0-9]+@[A-Za-z0-9]+\.[a-z]{2,}$'

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97750.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97750.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97750.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Dify 集成 Milvus 配置指南

🧩 Dify 集成 Milvus 配置指南 🔧 詳細配置步驟 1. 環境準備與克隆倉庫 首先確保你的系統已安裝 Git、Docker 和 Docker Compose。然后克隆 Dify 的代碼倉庫: git clone https://github.com/langgenius/dify.git cd dify/docker2. 配置環境變…

為不平,不止于此

口碑可以成就一個人,也可以毀掉一個人, 所以我們選擇用實力去創造兩種無聲的口碑。 要么讓期待的你張口而呼, 要么讓挑剔的你啞口無言。瑪哈特科技創始人 #為不平,不止于此#

0902 C++類的匿名對象

Part 1.梳理思維導圖一.匿名對象1.概念沒有對象名的類對象2.格式類名();3.作用1.給有名對象初始化2.給對象數組初始化3.作為函數的參數傳遞給形參4.例子#include <iostream>using namespace std;class Dog {friend void Dogfriend(Dog &b); private:string name;int …

在 PySpark 中解鎖窗口函數的力量,實現高級數據轉換

本篇文章Mastering PySpark Window Functions: A Practical Guide to Time-Based Analytics適合數據分析和工程師入門了解PySpark的窗口函數。文章的亮點在于詳細介紹了窗口函數的基本概念及其在銷售數據分析中的實際應用&#xff0c;幫助讀者理解如何進行復雜的數據計算而無需…

從理念到實踐:三層解耦架構與“無系統”論

在上一篇中&#xff0c;我們揭示了“五層雙閉環”治理模型如何像骨骼一樣&#xff0c;為數字化轉型提供支撐和定型。但再宏偉的藍圖也需要堅實的施工來實現。今天&#xff0c;我們將深入最具體的實施層面&#xff0c;將“業務重塑”和“以人為本”的理念&#xff0c;轉化為可落…

詳細介紹Linux 內存管理struct page數據結構中的_count和_mapcount有什么區別?

在Linux內核的struct page中&#xff0c;_count&#xff08;或_refcount&#xff09;和_mapcount是兩個關鍵的引用計數成員&#xff0c;它們各自承擔不同的職責。以下是深度解析和代碼案例&#xff1a;1. _count vs _mapcount 區別詳解_count&#xff08;或_refcount&#xff0…

面陣 vs 線陣相機:怎么選不踩坑?選型公式直接套用

面陣vs線陣相機&#xff1a;怎么選不踩坑&#xff1f;選型公式直接套用&#x1f3af;面陣vs線陣相機怎么選不踩坑&#xff1f;&#x1f3af;一、面陣相機&#xff1a;工業檢測的“萬能選手”&#xff0c;拍全圖靠它&#x1f3af;二、線陣相機&#xff1a;大視野/高精度的“專屬…

Spring Security 如何使用@PreAuthorize注解

&#x1f9f1; 第一步&#xff1a;環境準備? 1. 創建數據庫&#xff08;MySQL&#xff09;-- 創建數據庫&#xff0c;使用 utf8mb4 字符集支持 emoji 和多語言 CREATE DATABASE security_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 使用該數據庫 USE security…

JVM中產生OOM(內存溢出)的8種典型情況及解決方案

Java中的OutOfMemoryError&#xff08;OOM&#xff09;是當JVM內存不足時拋出的錯誤。本文將全面剖析JVM中產生OOM的各種情況&#xff0c;包括堆內存溢出、方法區溢出、棧溢出等&#xff0c;并提供詳細的診斷方法和解決方案。 一、OOM基礎概念 1.1 OOM錯誤類型 Java中的OOM是…

【IEEE出版、EI檢索、往屆會后3個月檢索】第四屆信號處理、計算機網絡與通信國際學術會議(SPCNC 2025)

第四屆信號處理、計算機網絡與通信國際學術會議&#xff08;SPCNC 2025&#xff09;將于2025年12月5-7日于中國武漢召開&#xff08;線上同步&#xff09;。為本次會議旨在齊聚海內外信號處理、計算機網絡與通信等計算機領域的專家學者&#xff0c;為相關領域研究和從業人員提供…

Spring boot注解介紹

1. Spring 核心注解Spring Boot 是基于 Spring 框架的&#xff0c;所以核心注解依然適用。? 常見核心注解Component表示一個通用組件&#xff0c;Spring 會自動掃描并注入到容器中。Component public class MyComponent {public void sayHello() {System.out.println("He…

撤銷回退 情況?:已經 add ,但沒有 commit

撤銷回退 情況?&#xff1a;已經 add &#xff0c;但沒有 commit add 后還是保存到了暫存區呢&#xff1f;怎么撤銷呢&#xff1f; 1 # 向ReadMe中新增??代碼 2 hyb139-159-150-152:~/gitcode$ vim ReadMe 3 hyb139-159-150-152:~/gitcode$ cat ReadMe 4 hello bit 5 hell…

【Linux筆記】命令行與vim基礎

一、Linux命令行基礎 1. 基本語法命令空格參數&#xff08;可寫可不寫&#xff09;空格文件&#xff0c;文件夾&#xff08;可寫可不寫&#xff09;ls列出文件夾中的內容/opt 根目錄下的opt文件夾ls-a all顯示出所有文件以及隱藏文件/optls-a如果不寫則輸出一個點&#xff0c;當…

Redis 的整數集合:像分類收納盒一樣的整數專屬存儲

目錄 一、先懂定位&#xff1a;為什么需要整數集合&#xff1f;&#xff08;銜接哈希表&#xff09; 二、整數集合的結構&#xff1a;像 “貼了規格標簽的收納盒” 1. encoding&#xff1a;收納盒的 “規格標簽”&#xff08;核心&#xff1a;決定格子大小&#xff09; 2. …

Linux 進程狀態 — 僵尸進程

&#x1f381;個人主頁&#xff1a;工藤新一 &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 文章目錄進…

React 中 key 的作用

React 中 key 的作用是什么&#xff1f; Date: August 31, 2025 Area: 原理key 概念 在 React 中&#xff0c;key 用于識別哪些元素是變化、添加或刪除的。 在列表渲染中&#xff0c;key 尤其重要&#xff0c;因為它能提高渲染性能和確保組件狀態的一致性。key 的作用 1&#x…

wpf之附加屬性

前言 附加屬性是 WPF 中一個非常強大和獨特的概念。簡單來說&#xff0c;它允許一個對象為另一個在其本身類定義中未定義的屬性賦值。 1、定義附加屬性 定義一個Watermark的附加屬性&#xff0c;該屬性的作用是將TextBox的附加屬性改變時&#xff0c;TextBox的字體顏色改成灰…

深入淺出 RabbitMQ-消息可靠性投遞

大家好&#xff0c;我是工藤學編程 &#x1f989;一個正在努力學習的小博主&#xff0c;期待你的關注實戰代碼系列最新文章&#x1f609;C實現圖書管理系統&#xff08;Qt C GUI界面版&#xff09;SpringBoot實戰系列&#x1f437;【SpringBoot實戰系列】SpringBoot3.X 整合 Mi…

數字化時代,中小企業如何落地數字化轉型

大數據時代&#xff0c;各行各業的行業龍頭和大型集團都已經開始了數據管理&#xff0c;讓數據成為數據資產。但是在我國&#xff0c;中小企業的數量巨大&#xff0c;很多管理者忽視了這一點&#xff0c;今天我們就來聊一聊中小企業的數字化轉型。中小企業需要數字化轉型首先要…

Unity筆記(九)——畫線功能Linerenderer、范圍檢測、射線檢測

寫在前面&#xff1a;寫本系列(自用)的目的是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解&#xff0c;方便自己以后快速復習&#xff0c;減少遺忘。這里只記錄代碼知識。十一、畫線功能Linerenderer畫線功能Linerenderer是Unity提供的畫線腳本&#xff0c;創建一個空…