五分钟系列-文本搜索工具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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;创建一个学生的信息表编号姓名性别…