当前位置: 首页 > article >正文

⚡️ Linux grep 命令参数详解

⚡️ 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 匹配输入参数

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

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

  • BRE 中这些字符通常需要转义;
  • EREPCRE 中则可直接使用。
    更多正则语法规则详见:regexp 正则表达式详解 (以后有空更)
🎯 3.1.2 grep 匹配输入项参数
  • -e PATTERN:指定一个匹配模式,可多次使用以指定多个模式。例如:
    grep -e "hello" -e "world" file.txt
    
  • -f FILE:从指定的文件中读取匹配模式(每行一个模式),适用于批量匹配。例如:
    grep -f patterns.txt application.log
    
📏 3.1.3 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

📁 3.1.4 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 匹配输出参数

📤 3.2.1 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:抑制错误信息输出,例如文件不存在时不会报错,适合批量操作。

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

在这里插入图片描述

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

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

在这里插入图片描述

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

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

在这里插入图片描述

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

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

在这里插入图片描述

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


🧱 3.2.3 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
    

⚠️ 4. 注意事项

⛔️ 4.1 grep -F 报错或卡死

在使用 grep 的 -F 参数来匹配固定字符串的时候可能会出现卡死或报错,就像这样:

在这里插入图片描述

解释:这里我希望搜索 grep --help 中和 --fixed-string参数有关的信息,但是 grep 给我报错了,说我格式不对

或者是这样:

在这里插入图片描述

解释:这里我希望搜索 grep_man.txt 这个文件里面和--fixed-string 参数有关的信息,但是 grep 给我直接卡住了

原因很简单,grep 把--fixed 当成了参数而不是匹配表达式,所以第一条命令缺少了匹配表达式,第二条命令缺少文件名,直接给我当成从终端输入,卡在那里等待我输入。

解决方法就是在-F 参数后面添加 -- 告诉 grep -F 后面没有参数了,跟的不是匹配表达式就是文件名,效果:

在这里插入图片描述


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

相关文章:

⚡️ Linux grep 命令参数详解

⚡️ Linux grep 用法及参数详解 📘 1. grep 简介 grep 是 Linux/Unix 系统中用于文本搜索的命令,其全称为 Global Regular Expression Print,意为全局正则表达式打印器。 它根据给定的 模式(pattern) 对文件或标准…...

2025年第三届CCF·夜莺开源创新论坛通知

点击蓝字 关注我们 CCF Opensource Development Committee 01 大会简介 由中国计算机学会主办、CCF开源发展委员会及夜莺开源社区承办的第三届CCF夜莺开源创新论坛拟于2025年7月4日在北京召开。本次论坛以“AI 加速可观测”为主题,汇聚了开源夜莺核心开发团队&#…...

GMDCMonitor企业版功能分享0602

企业版包含了拓扑中心、签退中心、知识库、通知渠道配置、平台自定义,这5个功能 1)拓扑中心 拓扑中心绘制的时候需要注意2点: 1)要先选择 “矩形区域” 或 “圆形区域” 来添加各个背景区域,同时录入区域尺寸&#x…...

automa

网页版插件 https://extension.automa.site/(可能插件下架了) https://github.com/AutomaApp/automa/releases/tag/v1.29.9(可以直接在git上下载) automa官网地址: https://www.automa.site/ 官方的文档 https://docs.automa.si…...

Warm-Flow发布1.7.3 端午节(设计器流和流程图大升级)

Warm-Flow发布1.7.3 端午节(设计器流和流程图大升级) 更新内容项目介绍功能思维导图演示地址官网Warm-Flow视频 更新内容 [feat] 新版流程图通过前端渲染[perf] 美化流程设计器ui[feat] 办理人权限处理器,新增办理人转换接口,比如…...

【存储基础】SAN存储基础知识

文章目录 1. 什么是SAN存储?2. SAN存储组网架构3. SAN存储的主要协议SCSI光纤通道(FC)协议iSCSIFCoENVMe-oFIB 4. SAN存储的关键技术Thin Provision:LUN空间按需分配Tier:分级存储Cache:缓存机制QoS&#x…...

2025年ESWA SCI1区TOP,改进成吉思汗鲨鱼算法MGKSO+肝癌疾病预测,深度解析+性能实测

1.摘要 本文针对肝癌(HCC)早期诊断难题,提出了一种基于改进成吉思汗鲨鱼优化算法(MGKSO)的计算机辅助诊断系统。由于HCC在早期症状不明显且涉及高维复杂数据,传统机器学习方法易受噪声和冗余特征干扰。为提…...

精益数据分析(93/126):增长率的真相——从数据基准到科学增长策略

精益数据分析(93/126):增长率的真相——从数据基准到科学增长策略 在创业领域,增长率常被视为企业成功的核心指标,但多少才算“足够好”?如何避免陷入“盲目增长陷阱”?今天,我们将…...

MAC上怎么进入隐藏目录

在Mac上,由于系统保护的原因,一些系统目录如/usr默认是隐藏的,但可以通过以下方法进入: 方法一:使用Finder的“前往文件夹”功能 打开Finder。使用快捷键Command Shift G,或者在菜单栏中选择“前往”-“…...

Spark-TTS: AI语音合成的“变声大师“

嘿,各位AI爱好者!还记得那些机器人般毫无感情的合成语音吗?或者那些只能完全模仿但无法创造的语音克隆?今天我要介绍的Spark-TTS模型,可能会让这些问题成为历史。想象一下,你可以让AI不仅说出任何文字&…...

【Python 进阶3】常见的 call 和 forward 区别

在 Python 和深度学习框架(如 PyTorch)中,__call__ 和 forward 是两个不同的概念,它们的用途和实现方式有明显区别: 1. __call__ 方法(Python 内置特殊方法) 在 Python 中,__call_…...

WEB3——简易NFT铸造平台之nft.storage

该平台目前已经不太支持免费试用,现在推荐Pinata平台,免费用1GB Pinata | Cryptos file storage 下面web3.storage也可以用,但是需要你有可以交易的外币卡 w3up console 🧠 1. nft.storage 是什么? https://nft.stor…...

一元函数积分

1. 不同名函数积分 2.三角函数有理式...

6年“豹变”,vivo S30系列引领手机进入场景“体验定义”时代

出品 | 何玺 排版 | 叶媛 5月29日晚,备受用户期待的vivo S30系列如约而至。 相比前几代S系列产品,S30系列变化显著,堪称“豹变”。首先,其产品打造思路发生了质变,产品体验更好,综合竞争力更为强。其次&a…...

Pytorch的梯度控制

在之前的实验中遇到一些问题,因为之前计算资源有限,我就想着微调其中一部分参数做,于是我误打误撞使用了with torch.no_grad,可是发现梯度传递不了,于是写下此文来记录梯度控制的两个方法与区别。 在PyTorch中&#x…...

linux驱动开发(1)-内核模块

内核模块 模块最大的好处是可以动态扩展应用程序的功能而无须重新编译链接生成新的应用程序镜像,在微软的Windows系统上动态链接库DLL(Dynamic Link Library),Linux系统上的共享库so(shared object)文件的…...

AI产品风向标:从「工具属性」到「认知引擎」的架构跃迁​

近年来,人工智能正在改变法律行业的游戏规则。从最初的“工具属性”——帮律师干些重复的杂活儿,到如今逐渐变身为“认知引擎”——能够理解法律逻辑、分析案例,法律AI产品正在迎来一场华丽的转身。这篇文章将带你一探究竟,看看这…...

前端八股之CSS

CSS 盒子模型深度解析与实战 一、盒子模型核心概念 Box-sizing CSS 中的 box-sizing 属性定义了引擎应该如何计算一个元素的总宽度和总高度 语法: box-sizing: content-box|border-box|inherit:content-box 默认值,元素的 width/height 不包含paddi…...

ps自然饱和度调整

在Photoshop(PS)中,自然饱和度调整是一项用于优化图像色彩的重要功能,以下是对其详细解析: 一、功能概述 自然饱和度主要针对画面中饱和度较低的像素进行着重调整,同时对高饱和度区域限制较小&#xff0c…...

有公网ip但外网访问不到怎么办?内网IP端口映射公网连接常见问题和原因

有公网IP但外网访问不到的核心原因通常包括:端口未正确映射、防火墙限制、DNS解析问题、运营商端口屏蔽或路由配置错误‌。需依次排查这些关键环节,其中端口映射和防火墙设置是最常见的原因。‌‌ ‌内网IP端口映射公网连接常见问题和原因及解决方案 1…...

InlineHook的原理与做法

InlineHook翻译为内联钩子 内联也就是我们的内联汇编 钩子就是修改目标的执行流程或代码 #include<iostream> using namespace std; #include<Windows.h>DWORD OldPro 0; //老的保护权限 char OldCode[9] { 0 }; //hook前的汇编代码 DWORD RetData 0; …...

微服务-Sentinel

目录 背景 Sentinel使用 Sentinel控制台 Sentinel控制规则 Sentinel整合OpenFeign 背景 在微服务项目架构中&#xff0c;存在多个服务相互调用场景&#xff0c;在某些情况下某个微服务不可用时&#xff0c;上游调用者若一直等待&#xff0c;会产生资源的消耗&#xff0c;极端情…...

DNS缓存

DNS详细解释 DNS缓存&#xff08;DNS Cache&#xff09;是指操作系统或应用程序在本地保存的一份“域名与IP地址的对应关系”记录。 1. DNS的基本作用 当你访问一个网站&#xff08;比如 www.jd.com&#xff09;时&#xff0c;计算机需要先把这个域名转换成实际的IP地址&…...

MySQL垂直分库(基于MyCat)

参考资料&#xff1a; 参考视频 参考博客 Mycat基本部署 视频参考资料&#xff1a;链接: https://pan.baidu.com/s/1xT_WokN_xlRv0h06b6F3yg 提取码: aag3 概要&#xff1a; 本文的垂直分库&#xff0c;全部是基于前文部署的基本架构进行的 垂直分库&#xff1a; 垂直分库…...

Rust 变量与可变性

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

深入理解 C++ 中的 list 容器:从基础使用到模拟实现

一、list 的底层数据结构与核心特性 1.1 双向循环链表的物理结构 节点定义&#xff1a;每个节点包含三个部分 template <typename T> struct ListNode {T data; // 存储的数据ListNode* prev; // 指向前驱节点的指针ListNode* next; // 指向后继节点的指针L…...

状态机实现文件单词统计

系统如何查找可执行文件 默认&#xff1a;在PATH路径下寻找文件文件下 执行当前目录下文件&#xff1a; ./&#xff1a;指定文件目录是当前目录 ./count:执行当前目录文件 编译.c文件为运行文件 gcc -o count 0voice.c #将0voice.c编译为名字count 为什么主函数要那么写&a…...

从0开始学习R语言--Day13--混合效应与生存分析

混合效应模型&#xff08;Mixed Effects Model&#xff09; 对于数据来说&#xff0c;我们通常把所有样本共有的影响因素&#xff08;性别&#xff0c;实验处理&#xff0c;实验方法&#xff09;&#xff0c;这种可以推广到总体的叫做固有效应&#xff0c;而仅适用于特定分组的…...

基于mediapipe深度学习的虚拟画板系统python源码

目录 1.前言 2.算法运行效果图预览 3.算法运行软件版本 4.部分核心程序 5.算法仿真参数 6.算法理论概述 7.参考文献 8.算法完整程序工程 1.前言 虚拟画板系统基于计算机视觉与深度学习技术&#xff0c;通过摄像头捕获用户手部动作&#xff0c;利用 MediaPipe框架实现手…...

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

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