grep命令——在文件中搜索指定的文本模式
grep是英文词组“global search regular expression and print out the line”的缩写,意思是全局搜索正则表达式,并将结果输出。
通常将grep命令与正则表达式搭配使用,命令选项作为搜索过程中的补充或对输出结果的筛选,命令模式十分灵活,功能非常强大。
如果想要搜索包含某一文本模式的文件,可以使用 grep 命令。通过使用该命令,可以搜索单个文件或者递归搜索整个目录结构。
当搜索时,可以在屏幕上打印输出满足条件的行,也可以仅列出包含搜索词的文件名。
默认情况下,grep 以区分大小写的方式搜索文本,也可以设置不区分大小写。
除了搜索文件外,还可以使用 grep 命令搜索标准输出。即如果某一命令输出了许多文本,现需要从中找到包含特定文本的行,也可使用grep进行过滤。
grep命令的语法格式如下:
grep [选项] 文本模式 文件
常用选项如下:
| 选项 | 作用或含义 |
| -i | 忽略大小写 |
| -c | 只输出匹配行的数量 |
| -l | 只列出符合匹配的文件名,不列出具体的匹配行 |
| -n | 列出所有的匹配行,显示行号 |
| -h | 查询多文件时不显示文件名 |
| -s | 不显示不存在、没有匹配文本的错误信息 |
| -v | 显示不包含匹配文本的所有行 |
| -w | 匹配整词 |
| -x | 匹配整行 |
| -r | 递归搜索 |
| -q | 禁止输出任何结果,已退出状态表示搜索是否成功 |
| -b | 打印匹配行距文件头部的偏移量,以字节为单位 |
| -o | 与-b结合使用,打印匹配的词距文件头部的偏移量,以字节为单位 |
| -F | 匹配固定字符串的内容 |
| -E | 支持扩展的正则表达式 |
实例演示:
1、在指定文件中搜索某个文本模式,输出包含了该文本模式的行
# 文本模式有空格时,建议用引号括起来,默认区分大小写
[root@myEuler ~]# grep 'desktop' /etc/services
desktop-dna 2763/tcp # Desktop DNA
desktop-dna 2763/udp # Desktop DNA# 不区分大小写
[root@myEuler ~]# grep -i 'desktop' /etc/services
sco-dtmgr 617/tcp # SCO Desktop Administration Server
sco-dtmgr 617/udp # SCO Desktop Administration Server
……此处省略部分输出……
2、在指定的多个文件中搜索
# 在多个文件中找出以root开头的行
[root@myEuler ~]# grep ^root /etc/passwd /etc/group
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/group:root:x:0:# 在多个文件中找出以root开头的行,不显示文件名
[root@myEuler ~]# grep -h ^root /etc/passwd /etc/group
root:x:0:0:root:/root:/bin/bash
root:x:0:# 在多个文件中查找,输出符合条件的行及其行号
[root@myEuler ~]# grep -hn ^nobody /etc/passwd /etc/group
13:nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
24:nobody:x:65534:
3、反向匹配,即找出不包含指定文本模式的行
#输出所有不包含nologin的行
[root@myEuler ~]# grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
……此处省略部分输出……
4、整词/整行匹配
#查找整行内容为lang zh_CN.UTF-8的行
[root@myEuler ~]# grep -x 'lang zh_CN.UTF-8' anaconda-ks.cfg
lang zh_CN.UTF-8#找出文本行中包含单词graphical的行
[root@myEuler ~]# grep -w graphical anaconda-ks.cfg
# Use graphical install
graphical
5、递归搜索,不仅搜索指定目录,还搜索其内子目录内是否有包含指定文本模式的文件
[root@myEuler ~]# grep -lsr 'openEuler 22.03' /etc
/etc/os-release
6、从命令输出信息中查找
grep也可以从命令输出信息中查找特定文本,只是通常需要配合管道线,示例如下:
# 从cat命令的执行结果中查找特定文本graphical
[root@myEuler ~]# cat anaconda-ks.cfg | grep graphical
# Use graphical install
graphical# 从网络连接中筛查出sshd进程连接
[root@myEuler ~]# netstat -antlp | grep sshd
7、利用正则表达式搜索特定文本模式
正则表达式包括基础正则表达式和扩展正则表达式。前面的以root开头的头(^root)就是一种基础正则表达式。
(1)基础正则表达式
常用的基础正则表达式如下:
| 正则表达式 | 含义 |
| * | *号前面的一个字符重复0到任意多次,如a*表示有0或多个a |
| . | 表示此处一定有一个且仅有一个任意字符 |
| [] | 与通配符相同,表示方括号中的单个字符,如[0-9]表示单个数字 |
| ^str | 以str开头的行,如^start表示以start开头的行 |
| str$ | 以str结尾的行,如end$表示以end结尾的行 |
| ^$ | 开头与结尾间无内容,也就是空行 |
| [[:alpha:]] | 代表任意字母,包括大小写 |
| [[:alnum:]] | 代表任意字母和数字,包括大小写 |
| [[:digit:]] | 代表任意数字,即0~9 |
| [[:lower:]] | 代表任意小写字母 |
| [[:upper:]] | 代表任意大写字母 |
| [[:blank:]] | 代表任意空格或制表符Tab |
| [[:print:]] | 代表任意可打印的字符 |
| [[:punct:]] | 代表标点符号 |
# 打印出所有以小写字母开头的行
[root@myEuler ~]# grep ^[[:lower:]] anaconda-ks.cfg
graphical
keyboard --vckeymap=cn --xlayouts='cn'
……此处省略部分输出……# 打印出所有非空行
[root@myEuler ~]# grep -v ^$ anaconda-ks.cfg
# Generated by Anaconda 36.16.5
# Generated by pykickstart v3.34
……此处省略部分输出……
(2)扩展正则表达式
| 正则表达式 | 含义 |
| ? | ?号前面的一个字符重复0次或1次,如a?表示有0或1个a |
| + | +号前面的一个字符至少重复1次,如a+表示有1个a或多个a |
| | | 表示|两侧的字符串是或者的关系,如dog|cat,坚线两侧无空格 |
| () | 表示括号内的字符串是一个组,如(c|b)a(b|t)表示cab、cat、bab、bat |
| \{n,m\} | 将前面的一个字符重复n到m次,\{n\}表示n次,\{n,\}表示n次以上 |
#查看cron或rsyslog进程状态
[root@myEuler ~]# ps aux | grep -E '(cron|rsyslog)'
root 1831 0.0 0.0 164368 9880 ? Ssl 3月07 0:04 /usr/sbin/rsyslogd -n -i/var/run/rsyslogd.pid
root 1858 0.0 0.0 23240 2736 ? Ss 3月07 0:00 /usr/sbin/crond -n
root 338425 0.0 0.0 21672 1944 pts/0 S+ 09:21 0:00 grep --color=auto -E (cron|rsyslog)
下面再举几个关于扩展正则表达式的例子,以帮助理解。
现假定file1的文件内容如下。
[root@myEuler ~]# cat file1
gg
go
gog
google
gooogle
gooooogle
# 找出包含文本模式go?g的行,其中的字母o至多出现一次
[root@myEuler ~]# grep -E 'go?g' file1
gg
gog# 找出包含文本模式go+g的行,其中的字母o至少出现一次
[root@myEuler ~]# grep -E 'go+g' file1
gog
google
gooogle
gooooogle# 找出包含文本模式gog或者ggg的行
[root@myEuler ~]# grep -E 'g(o|g)g' file1
gog# 找出包含文本模式go{2,5}g的行,其中的字母o可出现2到5次,其中的{}需转义
[root@myEuler ~]# grep -E go\{2,5\}g file1
google
gooogle
gooooogle
相关文章:
grep命令——在文件中搜索指定的文本模式
grep是英文词组“global search regular expression and print out the line”的缩写,意思是全局搜索正则表达式,并将结果输出。 通常将grep命令与正则表达式搭配使用,命令选项作为搜索过程中的补充或对输出结果的筛选,命令模式十…...
数据结构刷题(二十二):90子集II、491递增子序列、46全排列
1.子集II题目链接思路:这是一道标准的组合问题数组排序去重。依然是使用回溯。注意:去重代码只需要判断同一树层上是否有重复,同组合总和II(https://blog.csdn.net/xiaomingming99/article/details/129396344)解法&…...
AI+人类,实现高效网络安全
导语 聊天机器人和生成式人工智能(如 ChatGPT)突然成为主流让很多人感到担忧。很多人开始担忧,人工智能取代人的时代已经到来。 幸运的是,事实并非如此。 更有可能的情况是,人类将与 AI 合作创建工作角色的混合模型。…...
牛客小白月赛68【A-E】
文章目录A.Tokitsukaze and New Operation【模拟】B.Tokitsukaze and Order Food Delivery【模拟、特判】C.Tokitsukaze and Average of Substring【暴力、前缀】D.Tokitsukaze and Development Task【记忆化搜索】E.Tokitsukaze and Colorful Chessboard【预处理,二…...
WIFI P2P架构
WI-FI P2P定义架构3个组件组织结构技术标准P2P DiscoveryDevice Discovery(扫描)流程p2p probe 管理帧Group Formation(组网)GO Negotiation(GON)流程P2P Public Action管理帧Provision Discoveryÿ…...
架构师之中台思维_系统发展之路_结果和抽象之间平衡的艺术
父文章 如何成为一名架构师,架构师成长之路_golang架构师成长之路_个人渣记录仅为自己搜索用的博客-CSDN博客 任何系统的发展都是如此. 1. 业务增长 2. 烟囱增长 _ 结果优先 _ 太快去抽象抽象不好 3. 太多的烟囱, 3.1 抽象复用为平台 3.2 面对更多新的业务,提供不同的枚举值…...
23届非科班选手秋招转码指南
1.秋招情况介绍 1.1自我介绍 我是一名23届非科班转码选手,本硕均就读于某211院校机械专业,秋招共计拿下12份offer,包括大疆创新、海康威视、联发科技、理想汽车、中电28、阳光电源等各行业、各种性质企业的意向。主要的投递岗位为嵌入式软件…...
《传感器技术》考试学习笔记
文章目录一、选择题二、简答题1.什么是传感器?传感器的共性是哪些?2.差动变气隙式传感器电感传感器的灵敏度推导过程是什么(推导公式)?与单极性进行比较它们的优缺点是哪些?3.霍尔传感器如何进行微位移测量…...
第十五章 opengl之高级OpenGL(模板测试)
OpenGL模板测试模板函数物体轮廓模板测试 当片段着色器处理完一个片段后,模板测试就会开始执行。类似于深度测试,模板测试也可能会丢弃片段。被保留的片段会进入深度测试,可能会丢弃更多的片段。 模板测试是根据模板缓冲来进行的。一个模板缓…...
【C语言蓝桥杯每日一题】—— 单词分析
【C语言蓝桥杯每日一题】—— 单词分析😎前言🙌单词分析🙌总结撒花💞😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者…...
Web2:Tomcat
二.Web2:Tomcat 1.Tomcat的配置 2.Tomcat的工作方式 3.Tomcat服务器的虚拟映射 4.Tomcat部署到IDEA中使用 二.Web2:Tomcat 1.Tomcat的配置 ①安装下载Tomcat 配置好JAVA_HOME启动时保证端口号8080不被占用 ②下载后的目录结构 bin 启动或关闭to…...
C++语法规则2(C++面向对象)
继承 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。 当创建一个类时,您不需要重新编写新的数据成员和成…...
第八批国家药品集中采购-(附药品集采目录明细下载)
2023年3月2日,‘国家组织药品联合采购办公室’发出了《全国药品集中采购文件》,宣告了第八批国家组织药品集中采购工作正式开展,其公告中还包含三个附表分别为‘采购品种目录’、‘各地区首年约定采购量’、‘各采购品种首年约定采购量’&…...
政府工作报告连提9年科技创新 企业研发如何“又快又好”
今年的政府工作报告, “科技创新” 这一描述连续出现7次,这也是自2015年开始, “科技创新” 这一概念在全国“两会”政府工作报告中连续九年被提到。政府工作报告指出,科技政策要聚焦自立自强,完善新型举国体制&#x…...
GM8773C 是一款 1:2 DSI 桥接芯片,可实现 4 路进 8 路出转换器功能、视频分离器功能。
GM8773C 是一款 1:2 DSI 桥接芯片,可实现 4 路进 8 路出转换器功能、视频分离器功能。芯片内集成了一个 4 路单一链路的 MIPI DSI 接收器和 8 路双链路 MIPI DSI 发送器。 接 收 器 每 路 可 以 支 持 到 2.0Gbps/lane , 可 以 最 高 支 持 到…...
Java常用包名和说明
包名主要功能java.applet提供了创建applet需要的所有类java.awt.*提供了创建用户界面以及绘制和管理图形、图像的类java.beans.*提供了开发Java Beans需要的所有类java.io提供了通过数据流、对象序列以及文件系统实现的系统输入、输出java.lang.*Java编程语言的基本类库java.ma…...
dva01-初识
背景 React 本身只是一个 DOM 的抽象层,使用组件构建虚拟 DOM。如果开发大应用,还需要解决一个问题。 通信:React 只提供了一种传参手段,后续数据变化非常麻烦,无法适用于大应用。数据流:每次要更新数据&…...
信捷 XDH Ethercat A_WRITE指令
本指令修改指令轴的当前位置。 什么时候需要用本指令呢?换句话说,用本指令后,坐标原点修改了偏移了。如果在回原点后,往前走了一段距离x,如果是用绝对模式执行把位置修改成0,那么下一次开始每次做绝对运动A_MOVEA&…...
Spring Cloud ( Eureka集群的搭建 )
操作步骤: 添加主机映射创建Eureka服务 导入依赖编写启动类编写yml复制服务实例测试一、添加主机映射 以 Windows系统为例,如果要构建集群,需要修改 hosts 文件,为其添加主机名的映射。 打开C:\Windows\System32\drivers\etc\h…...
Python re 模块
正则表达式是一种小型、高度专业化的编程语言。适用于任何语言,在 Python 中通过 re 模块实现。正则模式被编译成一系列的字节码,然后由 C 语言编写的匹配引擎执行。给字符串模糊匹配 正则用于匹配字符串,匹配字符串可以完全匹配和模糊匹配&…...
WiMAX 802.16d技术架构与宽带部署实践
1. WiMAX 802.16d技术架构解析WiMAX 802.16d标准采用正交频分复用(OFDM)作为核心技术,通过将高速数据流分割为多个低速子载波传输,有效对抗多径干扰。其物理层支持256点FFT变换,每个子载波可独立选择BPSK、QPSK、16QAM…...
SurveyKing开源问卷系统部署配置教程:从零搭建企业级调查平台
SurveyKing开源问卷系统部署配置教程:从零搭建企业级调查平台 【免费下载链接】SurveyKing One command to deploy a more powerful, self‑hosted alternative to SurveyMonkey. 项目地址: https://gitcode.com/gh_mirrors/su/SurveyKing SurveyKing是一款功…...
Zotero-OCR插件:3步实现PDF文献智能识别与可搜索文本层添加
Zotero-OCR插件:3步实现PDF文献智能识别与可搜索文本层添加 【免费下载链接】zotero-ocr Zotero Plugin for OCR 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-ocr Zotero-OCR是Zotero文献管理软件的功能扩展插件,专门为PDF文档添加可搜索…...
动网格实战:Spring光顺法原理详解与案例剖析
1. Spring光顺法入门:为什么需要动网格处理? 做流体仿真的时候,经常会遇到边界运动的场景。比如汽车发动机里的活塞上下运动,或者心脏瓣膜的开合。这时候如果网格不动,就会出现边界穿过网格的尴尬情况——就像用固定渔…...
【12.MyBatis源码剖析与架构实战】16.2 if和where标签执⾏过程剖析-执行数据库时
MyBatis 执行阶段 foreach 标签执行过程剖析 在 MyBatis 运行时(执行 SQL 阶段),ForEachSqlNode 负责将传入的集合参数动态展开为 SQL 片段(如 IN (?, ?, ?)),并正确处理 open、close、separator 以及内部嵌套的动态标签。整个过程发生在 SqlSession 调用 Mapper 方法…...
OpenProject实战指南:三步构建企业级开源项目管理平台
OpenProject实战指南:三步构建企业级开源项目管理平台 【免费下载链接】openproject OpenProject is the leading open source project management software. 项目地址: https://gitcode.com/GitHub_Trending/op/openproject 还在为团队协作效率低下而烦恼吗…...
西门子SMART200通过PROFINET控制8台V90伺服实现绝对定位与断电保持
西门子smart控制8台v90模板(用smart200也可以西门子smart控制8台v90模板(用smart200也可以控制伺服动作,代替1200plc也是不错的选择需要调用smart里面的库文件)Profinet通讯控制8台v90伺服,控制8台伺服电机实现绝对定位并且断电位置保持功能,…...
如何在 WooCommerce 后台按订单总金额精准筛选订单
本文详解如何在 WooCommerce 管理后台为「订单列表」添加基于固定价格(如 $0、$18、$36)的下拉筛选器,通过正确挂钩 restrict_manage_posts 和 request 钩子,并使用 _order_total 元字段进行精确匹配,实现高效、稳定的…...
从FAST-LIO到FASTER-LIO:紧耦合激光惯性里程计的演进之路
1. FAST-LIO:紧耦合激光惯性里程计的开山之作 第一次接触FAST-LIO是在2019年,当时我正在为一个室内移动机器人项目寻找可靠的定位方案。传统LOAM系列算法虽然精度不错,但对计算资源要求太高,我们的NX开发板根本跑不动。直到看到FA…...
在 Xcode 中运行和调试单元测试:使用 Debug 和日志
单元测试是确保代码质量的重要手段,而运行和调试测试是开发者必备的技能。本文将介绍如何在 Xcode 中运行单元测试,并使用调试和日志工具来发现和解决问题。 运行单元测试 1. 设置测试目标 在 Xcode 中,为项目添加一个新的测试目标&#x…...
