⚡️ Linux grep 命令参数详解

article/2025/7/6 9:41:58

⚡️ Linux grep 用法及参数详解

📘 1. grep 简介

grep 是 Linux/Unix 系统中用于文本搜索的命令,其全称为 Global Regular Expression Print,意为全局正则表达式打印器。

它根据给定的 模式(pattern) 对文件或标准输入进行匹配,并输出符合条件的行。


⚙️ 2. grep 用法

🧾 2.1 从标准输入中搜索

grep [参数选项] [匹配表达式]

说明:

  • 不指定文件或路径时,grep 会等待标准输入,可直接通过键盘输入内容后按回车测试匹配行为。
  • 使用 Ctrl + D(Unix)或 Ctrl + Z(Windows)表示输入结束。

📄 2.2 从文件中搜索

grep [参数选项] [匹配表达式] [文件]

说明:

  • grep 会在指定文件中逐行搜索符合表达式的行。
  • grep 支持一次输入多个文件名,自动输出匹配所在的文件名与行内容。

📁 2.3 从目录中递归搜索

grep [参数选项] [匹配表达式] [路径]

说明:

  • grep 可以常配合 -r(递归)或 -R(递归并解析符号链接)选项对目录下的所有文件进行搜索。

🧩 2.4 从其他命令的输出中搜索(配合管道)

[其他命令] | grep [参数选项] [匹配表达式]

说明:

  • grep 可以对命令输出结果进行实时筛选。
  • 这种用法适合日志分析、进程查看、搜索历史记录等场景。

🛠️ 3. grep 参数

📌 3.1 grep 匹配输入参数

🔍 grep 匹配语法参数
  • -G(–basic-regexp):使用基本正则表达式(BRE,默认模式)。
  • -E(–extended-regexp):使用扩展正则表达式(ERE)。
  • -P(–perl-regexp):使用 Perl 风格的正则表达式(需 grep 支持 PCRE 扩展)。
  • -F(–fixed-strings):将匹配模式视为普通字符串,而非正则表达式。

在这四个参数都不存在的情况下,grep 会使用基本正则(-G 模式)。不同正则模式的主要区别在于是否需要对特殊字符(如 +*() 等)进行转义:

  • BRE 中这些字符通常需要转义;
  • EREPCRE 中则可直接使用。
    更多正则语法规则详见:regexp 正则表达式详解 (以后有空更)
🎯 grep 匹配输入项参数
  • -e PATTERN:指定一个匹配模式,可多次使用以指定多个模式。例如:
    grep -e "hello" -e "world" file.txt
    
  • -f FILE:从指定的文件中读取匹配模式(每行一个模式),适用于批量匹配。例如:
    grep -f patterns.txt application.log
    
📏 grep 匹配方式参数:
  • -i(–ignore-case):忽略大小写进行匹配。
  • --no-ignore-case:不忽略大小写(不加-i的话默认就是这个模式,加了这个参数可以覆盖 -i)。
  • -v(–invert-match):反向匹配,输出不匹配的行。
  • -w(–word-regexp):只匹配整个单词,而不是部分单词。效果:

在这里插入图片描述

解释:这里只匹配到了一整个单词的time没有匹配到current_timecheck_time这种半个单词的time

  • -x(–line-regexp):整行匹配,只有整行完全匹配才算成功。效果:

在这里插入图片描述

解释:这里只匹配到了一整行的 import time 没有匹配到一整行的 time

📁 grep 匹配文件与目录参数
  • -a:将二进制文件视为文本文件(用于分析其中可能包含的文本数据)。 效果:

在这里插入图片描述

注意:使用该选项可能导致输出大量乱码(途中的方块问号就是),因为二进制文件中包含非文本字符,会使终端显示异常或不可读字符。

  • --binary-files=binary:遇到二进制文件时的处理方式,把二进制文件当成二进制文件处理(默认行为,不输出匹配内容)。
  • --binary-files=text:遇到二进制文件时的处理方式,把二进制文件当成文本文件处理(和-a差不多,可能导致乱码)。
  • --binary-files=without-match:遇到二进制文件时的处理方式,跳过该文件,不进行匹配(比--bindary-file=binary更省时间)。
  • -d read:对目录的处理方式,读取目录内容(🐍皮玩法,目录有什么好读的)。
  • -d skip:对目录的处理方式,跳过目录(默认行为)。效果:

在这里插入图片描述

解释:这里为了跳过了distbuild目录匹配当前目录下的其他所有文件

  • -D read:匹配设备文件、FIFO、socket 文件时的处理方式,尝试读取这些特殊文件(🐍皮玩法,设备有什么好读的)。
  • -D skip:匹配设备文件、FIFO、socket 文件时的处理方式,跳过这些文件(默认行为)。效果:

在这里插入图片描述

解释:这里跳过设备文件(一般只有在/dev目录下才有设备文件,我这里虚空演示就当他有了)递归匹配当前目录下所有文件

  • --exclude=GLOB:匹配时跳过文件名符合 GLOB 模式的文件。效果:

在这里插入图片描述

解释: 不匹配二进制文件,同时排除所有html和py文件

  • --exclude-from=FILE:从 FILE 文件中读取 GLOB 模式来排除文件。
  • --exclude-dir=GLOB:排除指定模式的目录。
  • --include=GLOB:只匹配文件名符合 GLOB 模式的文件。 效果:

在这里插入图片描述

解释:这里只搜索toc文件

  • -r:递归处理目录。
  • -R:递归处理目录,并解析符号链接。

⚜️ 3.2 grep 匹配输出参数

📤 grep 全局输出参数
  • -c:只显示每个文件中匹配的行数。 效果:

请添加图片描述

解释: 这里在Table.py文件中搜索到了14条记录

  • --color=auto(默认):当输出目标为终端时高亮,重定向到文件或管道时不高亮。
  • --color=never:不高亮显示匹配内容。
  • --color=always:始终高亮显示匹配内容。效果:

请添加图片描述

解释:看到他红了没?

  • -L:只列出没有匹配结果的文件名。效果:

在这里插入图片描述

解释:和下图比较,这张图表示搜到的没有time的文件

  • -l:只列出匹配结果的文件名。效果:

在这里插入图片描述

解释:和上图比较,这张图表示搜到的有time的文件

  • -m NUM:最多匹配 NUM 条后停止搜索。效果:

在这里插入图片描述

注意:这张图表示我搜到的2条time的记录,但是经过我测试 -m NUM 参数对目录递归搜索不管用

  • -o:只输出匹配的部分内容,而不是整行,常用于提取正则表达式匹配到的字段。效果:

在这里插入图片描述

解释:正则表达式匹配到的类似xxx_time的字段,需要注意的是,由于我屏幕太窄,grep命令中的Table.py换行显示了,Table.py不是搜索到的结果(真想给他一拳)

  • -q:静默模式,不输出任何匹配内容,适用于脚本中只关心匹配结果的情况。
  • -s:抑制错误信息输出,例如文件不存在时不会报错,适合批量操作。

📝 grep 行输出参数
  • -b:在输出中显示每行前的字节偏移量。效果:

在这里插入图片描述

解释: 这里表示grep分别在第248、2024、2073……个字符的地方发现了time

  • -h:不要在输出中显示文件名(默认,即使匹配多个文件)。
  • -H:始终显示匹配行的文件名(即使只匹配一个文件)。效果

在这里插入图片描述

解释:输出结果每行前面加了个文件名,方便你递归搜索的时候找文件

  • -n:显示匹配行的行号。效果:

在这里插入图片描述

解释: 输出结果在每行前面加了行号,方便你用sed命令定位修改

  • -T:保持 Tab 字符宽度一致,利于对齐(仅在部分实现中有效)。效果:

在这里插入图片描述

解释:和上张图对比,只对齐了冒号,可见实际并没什么🥚用


🧱 grep 上下文输出参数
  • -A NUM:显示匹配行 之后 的 NUM 行。效果:

在这里插入图片描述

解释:显示了check_time后面的5行

  • -B NUM:显示匹配行 之前 的 NUM 行。效果:

在这里插入图片描述

解释:显示了check_time前面的5行

  • -C NUM:显示匹配行 前后 各 NUM 行。效果:

在这里插入图片描述

解释:check_out前后都有了

  • --no-group-separator:匹配段之间不显示分隔符。(默认)
  • --group-separator=SEP:自定义匹配项之间的分隔符。(要配合-A ,-B -C使用) 效果:

在这里插入图片描述

解释:这里可以自定义分隔符,我定义了===他就显示===了。这条命令一定要配合-A 、-B、-C使用,否则分隔符显示不出来

🧪 3.3 grep 特殊用法参数(🐍皮玩法,你这辈子都不一定会用到)

  • --line-buffered:按行刷新输出(通常 grep 默认采用块缓冲)。适合实时处理输出,例如日志流分析。例如:
    tail -f /var/log/syslog | grep --line-buffered "fail"
    
  • -U, --binary:以二进制模式读取文件,保留 Windows 文件中的 \r(回车符)。适用于对二进制数据或特定格式的分析。例如:
    grep -U $'\r\n' windows_data.txt
    
  • -z(–null-data):将 ASCII NUL (\0) 字符视为换行符,适用于处理以 NUL 分隔的记录,例如一些 tar 输出或 find -print0 的结果。例如:
    grep -z "hello" nul_separated.txt
    
  • -Z:在输出中使用 ASCII NUL (\0) 分隔匹配的文件名,适用于配合 xargs -0 等工具处理文件名中包含空格或换行的情况。例如:
    grep -rlZ "TODO" . | xargs -0 sed -i 's/TODO/DONE/g'
    
  • --label=LABEL:当输入为标准输入(如管道)时,强制为其命名(显示为文件名),以便区分多来源的输出。例如:
    echo "error: disk full" | grep --label=stdin "error"
    
  • --:标志参数结束,后续所有内容一律按文件名处理(即使看起来像参数)。用于防止文件名被误识别为选项。例如:
    grep "main" -- --filename-starts-with-dash.c
    

📖 参考资料
GNU grep 官方文档(在线)


http://www.hkcw.cn/article/HUMnnpbGQZ.shtml

相关文章

Rust 变量与可变性

文章目录 变量与可变性常量遮蔽(Shadowing) 变量与可变性 Rust中变量默认是不可变的,这是 Rust 鼓励你编写更安全、易于并发代码的众多方式之一。不过,你仍然可以选择让变量可变。让我们来探讨 Rust 为什么鼓励你优先使用不可变性…

YOLOV7改进之融合深浅下采样模块(DSD Module)和轻量特征融合模块(LFI Module)

目录 一、研究背景​ 二. 核心创新点​ ​2.1 避免高MAC操作​ ​2.2 DSDM-LFIM主干网络​ 2.3 P2小目标检测分支​ ​3. 代码复现指南​ 环境配置 关键修改点 ​4. 实验结果对比​ 4.1 VisDrone数据集性能 4.2 边缘设备部署 4.3 检测效果可视化 ​5. 应用场景​ …

(Python网络爬虫);抓取B站404页面小漫画

目录 一. 分析网页 二. 准备工作 三. 实现爬虫 1. 抓取工作 2. 分析工作 3. 拼接主函数&运行结果 四. 完整代码清单 1.多线程版本spider.py: 2.异步版本async_spider.py: 经常逛B站的同志们可能知道,B站的404页面做得别具匠心&…

Qt OpenGL 3D 编程入门

Qt 提供了强大的 OpenGL 集成功能,使得在 Qt 应用中实现 3D 图形变得更加简单。以下是使用 Qt 进行 OpenGL 3D 编程的基础知识。 1. 环境配置 创建 Qt 项目 新建 Qt Widgets Application 项目 在 .pro 文件中添加 OpenGL 模块: qmake QT co…

山东警方:10岁失联男童在河道溺亡 搜救行动告终

6月2日,山东滕州市公安局发布警情通报。5月31日22时35分许,警方接到孔某某报警,称其10岁的外孙赵某某于当天17时许离家后失联。接警后,公安机关迅速调阅监控、走访群众,并联合当地政府和社会救援力量,使用搜救警犬和无人机持续开展搜寻工作。6月2日15时许,在邻村一河道内…

韩国大选目前选情如何 李在明领跑选战

韩国第21届总统选举定于6月3日举行,主要候选人仍在抓紧最后机会展开竞选活动,争取更多选票。此次大选在前总统尹锡悦被弹劾后举行,共有7名候选人登记参选,但其中两人已宣布退选,最终有5名候选人参加角逐。这5名候选人分别是共同民主党候选人李在明、国民力量党候选人金文洙…

【深度学习新浪潮】以Dify为例的大模型平台的对比分析

我们从核心功能、适用群体、易用性、可扩展性和安全性五个维度展开对比分析: 一、核心功能对比 平台核心功能多模型支持插件与工具链Dify低代码开发、RAG增强、Agent自律执行、企业级安全支持GPT-4/5、Claude、Llama3、Gemini及开源模型(如Qwen-VL-72B),支持混合模型组合可…

【JAVA】注解+元注解+自定义注解(万字详解)

📚博客主页:代码探秘者 ✨专栏:《JavaSe》 其他更新ing… ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏作者水平有限,欢迎各位大佬指点&…

unity随机生成未知符号教程

目录 前言方法1方法2脚本后言示例代码 前言 在某些游戏中,有一些让人感到意味不明的未知符号,例如在游戏《巴别塔圣歌》中,就有这样一些能让人在初次就看不懂的未知符号。 或者在其他时候,这些未知符号如果跟粒子系统结合在一起的…

OpenCV——Mac系统搭建OpenCV的Java环境

这里写目录标题 一、源码编译安装1.1、下载源码包1.2、cmake安装1.3、java配置1.4、测试 二、Maven引入2.1、添加Maven依赖2.2、加载本地库 一、源码编译安装 1.1、下载源码包 官网下载opencv包:https://opencv.org/releases/ 以4.6.0为例,下载解压后&…

从Docker拉取镜像一直失败超时解决办法

项目场景: 在ubuntu中,使用docker拉去镜像时,一直超时,拉去失败。 问题描述 原因分析: 国外服务器网络不好导致。 解决方案: 解决方案1 设置国内源 我这边测试,更改以后仍然失败 阿里云提供…

告别printf!嵌入式系统高效日志记录方案

目录 1、分级控制与动态过滤机制 2、异步处理与零拷贝架构 3、跨平台适配层设计 在嵌入式系统开发领域,日志记录系统如同数字世界的黑匣子,承载着系统运行状态的关键信息。传统的printf调试方式虽简单易用,但在处理复杂系统时暴露出效率低…

复变函数 $w = z^2$ 的映射图像演示

复变函数 w z 2 w z^2 wz2 的映射图像演示 复变函数 w z 2 w z^2 wz2 是一个基本的二次函数,在复平面上具有有趣的映射性质。下面我将介绍这个函数的映射特性,并使用MATLAB进行可视化演示。 映射特性 极坐标表示:若 z r e i θ z …

【Redis】Zset 有序集合

文章目录 常用命令zaddzcardzcountzrange && zrevrangezrangebyscorezpopmax && bzpopmaxzpopmin && zpopmaxzrank && zrevrankzscorezremzremrangebyrankzremrangebyscorezincrby 集合间操作交集 zinterstore并集 zunionstore 内部编码应用场…

【AI论文】视觉语言模型中的自我修正推理

摘要:推理视觉语言模型(VLMs)在复杂的多模态任务上表现出了良好的性能。 然而,它们仍然面临着重大挑战:它们对推理错误高度敏感,需要大量带注释的数据或精确的验证器,并且难以在特定领域之外进行…

正则表达式在Java中的应用(补充)

正则表达式在Java中的应用 Java通过java.util.regex包提供正则表达式支持,核心类包括Pattern和Matcher。Pattern用于编译正则表达式模式,Matcher用于匹配操作。基本语法遵循标准正则规则,如\d匹配数字,\w匹配单词字符。 Pattern…

C++ 内存泄漏检测器设计

文章目录 1. C中的动态内存分配2. 什么是内存泄漏3. 内存泄漏的代码案例4. 内存泄漏检查器的设计模块1:位置信息捕获:模块2:内存分配跟踪:模块3:内存释放跟踪:模块4:泄漏记录存储:模…

线程安全与线程池

概念:多个线程,同时操作同一个共享资源的时候,可能会出现业务安全问题。 出现线程安全问题的条件,原因:1.存在多个线程在同时执行 2.同时访问一个共享资源 3.存在修改该共享资源 线程同步:是线程安全…

网络安全的学习路线是怎么样的?

我是几乎完全自学的,十年前从双非跨专业考研到中科大软件学院网络安全专业,读研之前,C语言是自学的,数据结构是自学的,计算机网络是自学的,操作系统是自学的,微机原理是自学的。为了让我们能跟上…

每日算法-250602

每日算法学习记录 - 250602 今天学习和复习了两道利用前缀和与哈希表解决的子数组问题,特此记录。 560. 和为 K 的子数组 题目 思路 本题的核心思想是利用 前缀和 与 哈希表 来优化查找过程。 解题过程 题目要求统计和为 k 的子数组个数。 我们首先预处理出一…