五分鐘系列-文本搜索工具grep

目錄

1??核心功能??

??2??基本語法??

3????常用選項 & 功能詳解??

??4??經典應用場景 & 示例??

5????重要的提示 & 技巧??

??6??總結??


grep?是 Linux/Unix 系統中功能強大的??文本搜索工具??,其名稱源自 "Global Regular Expression Print",用于在輸入數據中匹配指定模式(字符串或正則表達式)并輸出匹配行。

1??核心功能??

grep?的核心功能是:??掃描給定的輸入(文件或標準輸入流),匹配指定的模式(可以是簡單的字符串或復雜的正則表達式),然后將包含該模式的所有行打印(輸出)出來。??

??2??基本語法??

grep [options] pattern [file...]
  • ??[options]??: 控制 grep 行為的各種選項(標志)。
  • ??pattern??: 要搜索的模式(字符串或正則表達式)。如果模式包含空格或 Shell 特殊字符(如 $, *, ?, | 等),通常需要用引號('")括起來。
  • ??[file...]??: 可選的一個或多個要搜索的文件。如果省略文件,grep 會從標準輸入讀取數據。

3????常用選項 & 功能詳解??

  1. ??基礎搜索與顯示:??
    • -i (或 --ignore-case): ??忽略大小寫??。將模式中的字母視為不區分大小寫進行匹配。 (例如:grep -i 'error' log.txt 會匹配 "Error", "ERROR", "error" 等)
    • -v (或 --invert-match): ??反向匹配??。只打印 ??不匹配?? 模式的行。 (例如:grep -v 'debug' app.log 會顯示所有 不包含 "debug" 的行)
    • -n (或 --line-number): ??顯示行號??。在每個匹配行前面加上它在文件中的行號。 (例如:grep -n 'warning' script.py)
    • -c (或 --count): ??計數??。不顯示匹配的行,僅顯示匹配到的行數總和。
    • -H (或 --with-filename), -h (或 --no-filename): ??控制是否顯示文件名??。
      • -H: ??總是??在匹配行前顯示文件名(默認在搜索多個文件時自動顯示)。
      • -h: ??從不??顯示文件名(在搜索單個文件時也抑制文件名,更干凈)。
    • --color (或 --color=auto, --color=always, --color=never): ??彩色高亮??。高亮顯示匹配到的文本。auto 是常用且推薦的選項(僅當輸出到終端時高亮)。
  2. ??遞歸搜索 & 文件選擇:??
    • -r (或 -R, --recursive): ??遞歸搜索??。遞歸地讀取指定目錄下的 所有文件(包括子目錄)進行搜索。 (例如:grep -r 'functionName' /path/to/code/)
    • --include=GLOB: ??遞歸時包含文件??。指定要包含的文件模式(通配符)。
      (例如:grep -r --include='*.c' 'TODO' . 只在當前目錄(及子目錄)的 .c 文件中搜索 "TODO")
    • --exclude=GLOB: ??遞歸時排除文件??。指定要排除的文件模式。
      (例如:grep -r --exclude='*.log' 'error' . 排除所有 .log 文件)
    • --exclude-dir=GLOB: ??遞歸時排除目錄??。指定要排除的目錄模式(非常重要,避免搜索如 .git, node_modules 等大目錄)。
      (例如:grep -r --exclude-dir=.git 'pattern' .)
    • -l (或 --files-with-matches): ??僅顯示文件名??。只打印包含匹配項的文件名,不顯示具體的匹配行。
    • -L (或 --files-without-match): ??僅顯示不包含匹配的文件名??。
  3. ??模式匹配增強 (正則表達式):??
    • ??默認模式:?? grep 默認使用 ??基本正則表達式 (Basic Regular Expressions - BRE)??。BRE 中,部分元字符(如 (), {}, |, +, ?)需要轉義(加上 \)才能具有特殊含義。有些元字符(如 ., *, ^, $, [], [^])本身就是特殊元字符。
      • 例 (BRE): grep 'error\.' file(匹配 "error.",. 需要轉義以匹配字面點;\ 在 BRE 中是元字符)
    • -E (或 --extended-regexp): ??啟用擴展正則表達式 (Extended Regular Expressions - ERE)??。ERE 允許直接使用 (), {}, |, +, ? 作為元字符(功能更豐富,通常更易讀)。
      • 例 (ERE): grep -E '(error|warning)' file(匹配 "error" 或 "warning";| 不需要轉義)
    • -F (或 --fixed-strings): ??固定字符串模式??。將模式視為??純字符串??而非正則表達式。所有字符都沒有特殊含義。搜索速度快,適合搜索包含正則元字符的字面字符串。
      • 例: grep -F 'price: $19.99' file(直接搜索包含 $, . 等字符的字符串)
    • -P (或 --perl-regexp): ??啟用 Perl 兼容正則表達式 (Perl-Compatible Regular Expressions - PCRE)??。提供 Perl 語言級別的強大正則功能(如 \d, \s, \b, 非貪婪匹配 .*?, 前向/后向斷言等)。注意:并非所有系統/版本默認支持 -P
      • 例 (PCRE): grep -P '\bthe\b' file(匹配單詞 "the",使用 \b 單詞邊界;BRE/ERE 通常用 \<the\>-w
    • -w (或 --word-regexp): ??匹配整個單詞??。模式只匹配由非單詞字符(如空格、標點、行首/行尾)包圍的完整單詞。
      • 例: grep -w 'is' file 會匹配 "This is it" 中的 "is" 單詞,但不會匹配 "This" 或 "island" 中的 "is" 部分。
    • -x (或 --line-regexp): ??匹配整行??。要求整行內容??完全等于??給定的模式。
  4. ??輸出控制:??
    • -m NUM (或 --max-count=NUM): ??最大匹配數??。一旦在文件(或標準輸入)中找到 NUM 個匹配行即停止搜索。
    • -A NUM (或 --after-context=NUM): ??顯示匹配行之后的行??。額外顯示匹配行??之后??的 NUM 行上下文。
    • -B NUM (或 --before-context=NUM): ??顯示匹配行之前的行??。額外顯示匹配行??之前??的 NUM 行上下文。
    • -C NUM (或 --context=NUM): ??顯示匹配行上下的行??。同時顯示匹配行??前后??各 NUM 行上下文 (等價于 -A NUM -B NUM)。
    • -o (或 --only-matching): ??僅顯示匹配部分??。不顯示整行,只顯示每行中匹配到模式的那部分內容。在匹配復雜模式并提取特定字符串時非常有用。
    • -s (或 --no-messages): ??抑制錯誤消息??。不顯示關于不存在或無權限文件的錯誤消息。
    • -a (或 --text): ??將二進制文件當作文本處理??。強制 grep 像處理文本一樣處理二進制文件(否則可能輸出亂碼或根本不處理)。
    • -z (或 --null-data): ??使用 NUL 字符分隔數據??。將輸入視為由 NUL 字符(\0)分隔的記錄,而不是由換行符分隔。這對于搜索包含換行符的多行文本塊非常有用(通常與 -o 或特定模式結合)。輸出時也會用 NUL 分隔匹配項(常用于 xargs -0)。

??4??經典應用場景 & 示例??

  1. ??在文件中搜索關鍵詞:??
    grep 'important_thing' report.txt  # 在 report.txt 中查找包含 'important_thing' 的行
    grep -i 'critical' system.log     # 在 system.log 中忽略大小寫查找 'critical'
  2. ??結合管道 (|) 過濾命令輸出:??
    ps aux | grep 'firefox'         # 查找包含 'firefox' 的進程
    dmesg | grep -i 'error'         # 在系統日志中查找錯誤
    ls -l | grep 'Dec'              # 查看十二月份修改過的文件 (文件名包含Dec)
  3. ??遞歸搜索目錄:??
    grep -r 'TODO' ~/projects/       # 在 ~/projects 及其子目錄的所有文件中查找 "TODO"
    # 更精確的遞歸搜索 (限定文件類型,排除目錄)
    grep -r --include='*.py' --exclude-dir='__pycache__' 'def my_function' ./src/
  4. ??統計匹配行數:??
    grep -c 'success' app.log       # 統計 'app.log' 中 'success' 出現的行數
  5. ??查找不匹配的行:??
    grep -v '#' /etc/config.conf   # 顯示配置文件 /etc/config.conf 中所有非注釋行
  6. ??查找并顯示上下文:??
    grep -C 5 'Exception' error.log  # 在 'error.log' 中找 'Exception' 并顯示它前后各5行
  7. ??搜索整個單詞:??
    grep -w 'get' source.c         # 在 'source.c' 中只匹配單詞 "get",不匹配 "target"
  8. ??僅提取匹配部分:??
    echo 'My IP is 192.168.1.100' | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' # 提取 IP 地址
  9. ??使用擴展正則表達式匹配多個模式:??
    grep -E 'error|fail|fatal' log.txt  # 在 'log.txt' 中查找包含 'error', 'fail' 或 'fatal' 的行

5????重要的提示 & 技巧??

  • ??引號保護模式:?? 如果模式包含空格或特殊字符(如 $, *, ?, |, (, ) 等),??強烈建議??用單引號 ' 將模式括起來,防止 Shell 解釋這些字符。雙引號 " 也行,但需要更小心 $! 等字符。
  • ??默認行為差異:?? 當指定文件時,grep 會搜索文件內容。當沒有文件參數或使用管道時,grep 會搜索來自前一個命令的標準輸出。
  • ??正則表達式威力:?? grep 的強大主要源于其正則表達式支持。花時間學習 BRE/ERE/PCRE 語法會大大提升你的搜索能力。許多 grep 手冊頁(man grep)中有專門的正則表達式部分。
  • ??處理特殊字符:?? 如果要精確匹配包含正則元字符的字面字符串(例如 $),使用 -F(固定字符串模式)或者用 \ 轉義元字符(在 BRE 中)。
  • ??egrepfgrep 的演變:?? 過去 egrep 等價于 grep -Efgrep 等價于 grep -F。現在 grep -Egrep -F 是更標準的寫法,通常建議避免使用 egrep/fgrep 命令。
  • ??性能考量:??
    • -F 比使用正則表達式快得多。
    • grep -v 通常也比更復雜的正向模式過濾快。
    • 在遞歸搜索 (-r) 時,明智地使用 --include, --exclude, --exclude-dir 可以大幅減少文件掃描數量,極大提升速度,尤其在大項目中。
    • 避免在管道鏈的開頭使用 cat file | grep pattern,直接 grep pattern file 效率更高(少一個進程)。

??6??總結??

grep 是 Linux/Unix 命令行工具箱中不可或缺的瑞士軍刀。掌握 grep 及其豐富的選項,特別是正則表達式的使用,能夠讓你在海量文本中快速、精確地定位所需信息,大幅提高命令行工作效率和文本處理能力。無論你是系統管理員、開發人員還是數據分析師,熟練運用 grep 都是必備的基礎技能。

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

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

相關文章

Java面試題及詳細答案120道之(041-060)

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

【嘗試】本地部署openai-whisper,通過 http請求識別

安裝whisper的教程&#xff0c;已在 https://blog.csdn.net/qq_23938507/article/details/149394418 和 https://blog.csdn.net/qq_23938507/article/details/149326290 中說明。 1、創建whisperDemo1.py from fastapi import FastAPI, UploadFile, File import whisper i…

Visual Studio 的常用快捷鍵

Visual Studio 作為主流的開發工具&#xff0c;提供了大量快捷鍵提升編碼效率。以下按功能分類整理常用快捷鍵&#xff0c;涵蓋基礎操作、代碼編輯、調試等場景&#xff08;以 Visual Studio 2022 為例&#xff0c;部分快捷鍵可在「工具 > 選項 > 環境 > 鍵盤」中自定…

Triton Server部署Embedding模型

在32核CPU、無GPU的服務器上&#xff0c;使用Python后端和ONNX后端部署嵌入模型&#xff0c;并實現并行調用和性能優化策略。方案一&#xff1a;使用Python后端部署Embedding模型 Python后端提供了極大的靈活性&#xff0c;可以直接在Triton中運行您熟悉的sentence-transformer…

Java動態調試技術原理

本文轉載自 美團技術團隊胡健的Java 動態調試技術原理及實踐, 通過學習java agent方式進行動態調試了解目前很多大廠開源的一些基于此的調試工具。 簡介 斷點調試是我們最常使用的調試手段&#xff0c;它可以獲取到方法執行過程中的變量信息&#xff0c;并可以觀察到方法的執…

人工智能-python-OpenCV 圖像基礎認知與運用

文章目錄OpenCV 圖像基礎認知與運用1. OpenCV 簡介與安裝OpenCV 的優勢安裝 OpenCV2. 圖像的基本概念2.1. 圖像的存儲格式2.2. 圖像的表示3. 圖像的基本操作3.1. 創建圖像窗口3.2. 讀取與顯示圖像3.3. 保存圖像3.4. 圖像切片與區域提取3.5. 圖像大小調整4. 圖像繪制與注釋4.1. …

Windows電腦添加、修改打印機的IP地址端口的方法

本文介紹在Windows電腦中&#xff0c;為打印機添加、修改IP地址&#xff0c;從而解決電腦能找到打印機、但是無法打印問題的方法。最近&#xff0c;辦公室的打印機出現問題——雖然在電腦的打印機列表能找到這個打印機&#xff0c;但是選擇打印時&#xff0c;就會顯示文檔被掛起…

告別復雜配置!Spring Boot優雅集成百度OCR的終極方案

1. 準備工作 1.1 注冊百度AI開放平臺 訪問百度AI開放平臺 注冊賬號并登錄 進入控制臺 → 文字識別 → 創建應用 記錄下API Key和Secret Key 2. 項目配置 2.1 添加依賴 (pom.xml) <dependencies><!-- Spring Boot Web --><dependency><groupId>o…

「iOS」——內存五大分區

UI學習iOS-底層原理 24&#xff1a;內存五大區總覽一、棧區&#xff08;Stack&#xff09;1.1 核心特性1.2 優缺點1.3函數棧與棧幀1.3 堆棧溢出風險二、堆區&#xff08;Heap&#xff09;;2.1 核心特性2.2 與棧區對比三、全局 / 靜態區&#xff08;Global/Static&#xff09;3.…

每日一題【刪除有序數組中的重復項 II】

刪除有序數組中的重復項 II思路class Solution { public:int removeDuplicates(vector<int>& nums) {if(nums.size()<2){return nums.size();}int index 2;for (int i 2; i < nums.size();i ) {if(nums[i] ! nums[index-2]) {nums[index]nums[i];}}return ind…

兼容性問題記錄

1、dialog設置高度MATCH_PARENT全屏后&#xff0c;三星機型和好像是一加&#xff0c;會帶出頂部狀態欄&#xff0c;設置隱藏狀態欄屬性無效。解決方法&#xff1a;高度不設置為MATCH_PARENT&#xff0c;通過windowmanager.getdefaultdisplay來獲取并設置高度&#xff0c;再設置…

6.數組和字符串

在C語言中&#xff0c;數組和字符串是基礎且重要的概念。它們用于存儲和操作一系列相同類型的元素或字符序列。數組1. 數組定義與初始化數組是一系列相同類型的數據項的集合&#xff0c;這些數據項可以通過一個共同的名字來引用。數組中的每個元素都有一個索引&#xff08;也稱…

odoo代碼分析(一)

Odoo 是一套基于網絡的開放式源代碼商業應用套件,既可以作為獨立應用運行,也可以作為集成的全功能 ERP 系統使用。Odoo 平臺采用模塊化架構,允許組織根據自身需求起步,并在需求增長時擴展功能。 什么是 Odoo? Odoo 提供了一個完整的商業應用生態系統,包括: 客戶關系管…

從“人工眼”到‘智能眼’:EZ-Vision視覺系統如何重構生產線視覺檢測精度?

制造業是我國實體經濟的基礎&#xff0c;是國內經濟增長的重要引擎。制造業智能化建設是當下的必然趨勢&#xff0c;然而目前依舊有很多中小型企業因為成本原因&#xff0c;無法加快智能化制造的步伐。在智能檢測領域更是如此&#xff0c;很多企業依舊在采用人工檢測&#xff0…

Etcd原理基礎學習

etcd 是一個開源的分布式鍵值存儲系統&#xff0c;專注于提供高可用性、強一致性的數據存儲與訪問&#xff0c;廣泛應用于分布式系統的服務發現、配置管理和協調任務。以下是其核心特性和應用場景的詳細介紹。接下來就看看Etcd如何實現服務注冊&#xff0c;以及如何通過Raft算法…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-32,(知識點:模數轉換器,信噪比,計算公式,)

目錄 1、題目 2、解答 步驟一&#xff1a;明確理想 ADC 的信噪比公式 步驟二&#xff1a;推導公式的來源 步驟三&#xff1a;得出答案 3、相關知識點 一、信噪比&#xff08;SNR&#xff09;的定義 二、理想 ADC 的量化噪聲 三、滿量程正弦波信號的功率 四、信噪比公…

Redis過期數據的刪除策略是什么?有哪些?

定時刪除&#xff1a;- 每個設置了TTL的key中都會創建一個計時器&#xff0c;等到過期時間就會立即刪除- 對內存友好&#xff0c;但是會占用大量的CPU資源去處理過期數據&#xff0c;從而影響緩存的吞吐量和響應時間惰性刪除&#xff1a;- 設置了key的過期后&#xff0c;不會立…

linux dd命令詳解

dd 是一個功能強大的 Unix/Linux 命令行工具&#xff0c;用于低級別的字節流操作&#xff0c;常用于創建、復制、轉換和處理文件或設備數據。它在 macOS 和 Linux 系統上都可用&#xff0c;但在 macOS 上有一些細微差異。本文將詳細講解 dd 命令的用法&#xff0c;包括參數、常…

多線程同步技術是用于協調多個線程訪問共享資源或執行順序的機制,以避免數據競爭、死鎖、線程不安全等問題

多線程同步技術是用于協調多個線程訪問共享資源或執行順序的機制,以避免數據競爭、死鎖、線程不安全等問題。 在提供的代碼中,存在多線程操作加熱板的場景,涉及鎖競爭和硬件資源訪問,優化多線程同步可以顯著提升程序性能和穩定性。 以下是多線程同步技術的詳細解釋、常見…

CRMEB標準版,從創建數據表到實現最基礎增刪改查的實現過程

很多使用了CRMEB單商戶系統的童鞋在進行二開的時候&#xff0c;都會遇到新建了數據表之后不知道對數據表怎么進行操作。那么&#xff0c;這篇文章將帶你完整的實現一遍&#xff0c;以后就不會怕啦。一、創建數據表就以最簡單的為例&#xff0c;創建一個學生的信息表編號姓名性別…