grep 是 Linux/Unix 系统中用于文本搜索的强大工具,支持基于正则表达式的模式匹配。以下是其详细用法及实际应用示例:


基本语法

grep [选项] 模式 [文件...]
  • 模式:要搜索的字符串或正则表达式。
  • 文件:可以是单个文件或多个文件,也可以通过管道符传递输入。

常用选项

选项功能
-i忽略大小写(如 grep -i "hello" file 匹配 helloHELLO
-v反向匹配(显示不包含模式的行)
-n显示匹配行的行号
-l仅显示包含匹配项的文件名
-c统计匹配行的数量
-r / -R递归搜索目录中的文件(-R 不跟随符号链接)
-w全字匹配(如 -w "error" 不匹配 error123
-x匹配整行(如 -x "apple" 只匹配整行 apple
-A NUM显示匹配行及其后 NUM
-B NUM显示匹配行及其前 NUM
-C NUM显示匹配行及前后各 NUM
-H显示文件名(多文件时默认开启)
-m NUM最多显示 NUM 个匹配项
-q静默模式(仅返回状态码,0 表示匹配成功)
-E使用egrep命令
-color = auto为grep过滤结果添加颜色

正则表达式

grep 支持 基本正则表达式(BRE)扩展正则表达式(ERE)

  1. 基本正则表达式(BRE)【默认支持】

    • .:匹配任意单个字符

      grep "a.b" file.txt  # 匹配 "aab"、"acb" 等
      
    • *:匹配前一个字符 0 次或多次

      grep "go*gle" file.txt  # 匹配 "ggle"、"google" 等
      
    • ^:匹配行首

      grep "^start" file.txt  # 匹配以 "start" 开头的行
      
    • $:匹配行尾

      grep "end$" file.txt  # 匹配以 "end" 结尾的行
      
  2. 扩展正则表达式(ERE)

    • |:逻辑“或”

      grep -E "error|fail" log.txt  # 匹配 "error" 或 "fail"
      
    • +:匹配前一个字符 1 次或多次

      grep -E "go+gle" file.txt  # 匹配 "gogle"、"google" 等
      
    • ?:匹配前一个字符 0 次或 1 次

      grep -E "colou?r" file.txt  # 匹配 "color" 或 "colour"
      
    • {n,m}:匹配前一个字符 nm

      grep -E "a{2,4}" file.txt  # 匹配 "aa"、"aaa" 或 "aaaa"
      
  3. 字符集合

    • [abc]:匹配任意一个字符(a、b 或 c)

      grep "[0-9]" file.txt  # 匹配任意数字
      
    • [^abc]:匹配不在集合中的字符

      grep "[^0-9]" file.txt  # 匹配非数字字符
      

扩展知识BRE、ERE

BRE(基本正则表达式)
  • 支持的元字符^(行首)、$(行尾)、.(任意单个字符)、*(零次或多次匹配)、[](字符集)、\{m,n\}(重复次数)。

  • 需要转义的元字符

    • ():需要转义为 \(...\) 才能表示分组。
    • {}:需要转义为 \{m,n\} 才能指定重复次数。
    • |:需要转义为 \| 才能表示“或”操作。
  • 示例

    # 匹配以 "error" 开头的行(BRE)
    grep '^error' /var/log/syslog# 匹配连续 3 到 5 个数字(BRE)
    grep '[0-9]\{3,5\}' /var/log/syslog
    
ERE(扩展正则表达式)
  • 支持的元字符:BRE 的所有元字符,外加以下扩展:

    • +:前一个字符出现 1 次或多次
    • ?:前一个字符出现 0 次或 1 次
    • {m,n}:前一个字符出现 m 到 n 次(无需转义)。
    • ():分组(无需转义)。
    • |:逻辑“或”操作(无需转义)。
  • 无需转义+?{}()|

  • 示例

    # 匹配 "error" 或 "fail"(ERE)
    grep -E 'error|fail' /var/log/syslog# 匹配连续 3 到 5 个数字(ERE)
    grep -E '[0-9]{3,5}' /var/log/syslog
    

高级用法

  1. 递归搜索

    grep -r "error" /var/log/  # 在 /var/log 目录及其子目录中搜索 "error"
    
  2. 统计匹配行数

    grep -c "success" file.txt  # 统计 file.txt 中包含 "success" 的行数
    
  3. 显示上下文

    grep -A 2 -B 1 "keyword" file.txt  # 显示匹配行、前1行和后2行
    
  4. 多模式匹配

    grep -e "pattern1" -e "pattern2" file.txt  # 同时搜索 pattern1 和 pattern2
    
  5. 排除特定文件类型

    grep --include="*.log" "error" /path/  # 仅搜索 .log 文件
    grep --exclude="*.tmp" "error" /path/   # 排除 .tmp 文件
    
  6. 高亮匹配内容

    grep --color=auto "keyword" file.txt  # 匹配内容高亮显示
    

常见场景示例

  1. 忽略大小写搜索

    grep -i "linux" file.txt  # 匹配 "Linux"、"LINUX" 等
    
  2. 查找不包含某字符串的行

    grep -v "skip" file.txt  # 显示不包含 "skip" 的行
    
  3. 统计匹配行数

    grep -c "404" access.log  # 统计日志中 404 错误的数量
    
  4. 递归搜索并显示文件名

    grep -rl "TODO" /project/  # 列出 /project/ 中包含 "TODO" 的文件名
    
  5. 使用正则表达式

    grep -E "^#include" file.c  # 匹配以 #include 开头的行
    grep -o "\b[0-9]\+\b" file.txt  # 仅输出所有独立的数字
    

egrep核心区别

特性grepegrep
正则表达式类型基本正则表达式 (BRE)扩展正则表达式 (ERE)
性能更快(处理简单模式)稍慢(处理复杂模式)
语法灵活性需要转义特殊字符(如 |, \+直接使用特殊字符(如 `
系统兼容性所有 Unix/Linux 系统均支持部分系统(如 macOS)可能不预装
等效命令grep(默认)grep -E(与 egrep 等效)

简单总结

  • grep:适合简单模式匹配,兼容性更好,性能更高。
  • egrep:适合复杂模式匹配,语法更简洁,但性能稍逊。
  • 在实际使用中,如果需要扩展正则表达式功能,推荐使用 grep -E(等效于 egrep),这样可以避免系统兼容性问题。

注意事项

  • 扩展正则表达式:使用 egrepgrep -E 启用更灵活的正则语法(如 +?() 分组)。
  • 搜索结果太多:分页查看:grep "pattern" file.txt | less
  • 性能优化:搜索大文件时,使用 -m 限制匹配数量或 --binary-files=without-match 跳过二进制文件。
  • 帮助文档:通过 man grep 查看完整选项列表和详细说明。

如果有意见和或者建议欢迎留言讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/83994.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/83994.shtml
英文地址,请注明出处:http://en.pswp.cn/web/83994.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 11g通过rman做备份和还原

ORACLE RMAN增量备份完整恢复测试 1.创建测试环境: 1.1.创建测试表空间 SQL> create tablespace tablespace1 datafile ‘/data/u01/app/oracle/oradata/orcl/tablespace1.dbf’ size 10m; SQL> 1.2.创建测试用户并指定为默认表空间: SQL> create user user1 iden…

为什么TCP有粘包问题,而UDP没有

TCP粘包问题源于其面向字节流的设计,而UDP无此问题因其基于数据报的传输机制。 🔍 一、TCP粘包问题的原因 字节流传输特性 TCP将数据视为连续的字节流,而非独立的消息包。发送端多次写入的小数据可能被合并为一个TCP段发送;接收端…

ELM:Embodied Understanding of Driving Scenarios

1. ELM 的创新点与核心思路 ELM 的核心在于 “具身理解”(Embodied Understanding),即通过常识与环境交互并进行推理,这一理念适用于自动驾驶车辆、机器人和无人机等多种应用场景。具身智能体(Embodied Agent)需具备四大核心能力:首先,它能够描述周围环境,对交通物体的…

实景VR知识科普

实景VR的定义与技术特点 实景VR,即基于真实场景的虚拟现实技术,是通过计算机生成的三维环境,旨在模拟并再现真实世界场景。用户佩戴VR设备(如VR头盔、手柄等)后,能够沉浸在一个高度仿真的虚拟环境中&#…

CppCon 2016 学习:ITERATOR HAIKU

这组幻灯片讲解了 C 中**范围(Ranges)和迭代器(Iterators)**的核心概念,特别是 C14 标准定义的五种迭代器类别,以及范围的基本使用方式。我帮你理个思路: 1. RANGE-SEQUENCE: 元素范围&#xf…

开源飞控fmt软件在环仿真环境搭建

tags: 飞控 fmt开发环境搭建 fmt是国产开源飞控,特点是支持基于模型设计(基于simulink仿真),源码结构目录较清晰,项目体积较小。 此项目操作系统选择的是国产实时操作系统rt-thread,也是开源项目。&#…

如何通过AI测试平台实现自动化缺陷检测和优化

在数字化转型加速的今天,软件质量保证已成为企业竞争力的关键要素之一。传统的手工测试方法面临着效率低下、成本高昂和覆盖面有限等挑战,而AI技术的融入为软件测试领域带来了革命性的变化。本文将深入探讨如何构建一个完整的AI测试平台,实现…

使用JeecgBoot配置

Jeecg 使用方法 本文以在环境配置好的前提下进行讲解 如果不会配置环境 可在billbill网站的Jeecg官网搜索环境配置 第一步 打开redis,redis是一个服务,需要用命令行打开 且命令行不能关 不能实现一劳永逸效果 每次关闭都得重新打开一次。 第二步 启动j…

NodeJS:版本及对应时间并对应的npm版本

versionltsrelease dateenginenpmnode下载更新日志文档Node.js 24.0.1✅2025-05-0813.61--下载更新日志文档Node.js 22.12.0✅2024-12-03---下载更新日志文档Node.js 21.2.0 2023-11-1411.8.172.1710.2.3120下载更新日志文档Node.js 20.10.0✅2023-11-2211.3.244.810.2.3115下载…

UI前端大数据处理:应对海量数据的挑战与策略

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字化转型的深水区,全球每日产生的数据量已突破 500EB,相当于 10 亿…

对微服务的了解

微服务是一种架构风格,我们可以把应用程序划分为一组小型的、松散耦合的服务, 每个服务都运行在自己的进程中,并通过轻量级的通信机制进行通信, 每个服务都是独立部署、独立扩展、独立更新的,从而提高了应用程序的可伸…

计算机视觉生物启发视觉算法:如何模拟人眼与大脑?

计算机视觉生物启发视觉算法:如何模拟人眼与大脑? 一、前言二、人眼与大脑视觉系统基础概念​2.1 人眼的生理结构与功能​2.2 大脑视觉皮层的信息处理机制​三、生物启发视觉算法的核心技术​3.1 视网膜启发的特征提取算法​3.2 视觉皮层启发的分层特征学习算法​3.3 注意力机…

stm32使用定时器功能之高精度定时(微秒级)、输入捕获以及超声波测距

一、定时器功能之高精度定时(微秒级) 我们常用的延时函数中无论是HAL_Delay还是vTaskDelay()函数都是毫秒级的定时,我们可以借助定时器实现一个微秒级更高精度的延时函数。这个定时器不会影响FreeRtos的任务切换 这里就是用定时器的计数功能…

Git常用命令摘要

写这篇博文的目的只是简单的给自己及团队的日常工作中需要用到的git命令作个汇总,这样平时只需要查阅这篇文章就够了,不用到处查找。如果能给有需要的朋友一点点的帮助,那也算是意外之喜吧。 一、基础配置 # 设置用户名和邮箱(首…

ubuntu 22.04 安装部署kibana 7.10.0详细教程

安装部署kibana 7.10.0详细教程 下载并安装二、修改kibana.yml文件三、性能配置四、启动服务验证五、安装启动常见问题 【背景】 整个elk安装是基于ubuntu 22.04和jdk 11环境。kibana均采用 *.deb方式安装,需要服务器能联网。ubuntu 22.04 安装部署elk(elasticsearc…

nfs 服务器的搭建

nfs 服务器的搭建 1.配置yum源 mkdir /etc/yum.repos.d/bak mv /etc/yum.repo.d/*.repo /etc/yum.repos.d/bak/ curl -o /etc/yum.repos.d/centos.repo http://10.26.210.101/centos/centos.repo # 外网 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.c…

Yii2 基础版实现 Token 认证 API 服务的完整框架方案

以下是一个基于 Yii2 基础版实现 Token 认证 API 服务的完整框架方案,包含 JWT 实现和完整代码: 1. 环境准备 composer create-project --prefer-dist yiisoft/yii2-app-basic yii2-api cd yii2-api2. 安装必要扩展 composer require firebase/php-jw…

主流版本控制工具Git vs Perforce P4:架构模式、性能、大文件管理及分支管理对比详解

Git和Perforce P4是两个强大的源代码管理工具,各有其独特的功能优势与适用场景。 本文中,Perforce中国授权合作伙伴-龙智将从架构设计、性能表现、文件管理及分支策略等维度,为您详细解析两者的关键差异,帮助您根据团队需求&…

文件系统2(Linux下)

1 挂载分区 文件系统1中已经知道了能够根据inode号在指定分区找文件了,也已经能根据目录文件内容,找指定的inode了,在指定的分区内,就可以对文件进行操作了。但是还有几个问题,那就是inode是不能跨分区的,…

Leetcode-​2537. 统计好子数组的数目​

Problem: 2537. 统计好子数组的数目 思路 滑动窗口 解题过程 思路: 使用滑动窗口来维护子数组,并通过组合计数动态调整满足条件的数对数目。具体来说,我们维护一个窗口[l,r],使得窗口内相同元素的对数至少为 k,并计算…