文本编辑三剑客(grep)

news2024/9/21 5:49:41

目录

正则表达式

元字符

grep

案例

我在编写脚本的时候发现,三个文本编辑的命令(grep、sed、awk,被称为文本编辑三剑客,我习惯叫它三巨头)用的还挺多的,说实话我一开始学的时候也有些懵,主要是太多太杂,有那么个别些还有点难懂,最近恰好有时间,索性把三剑客相关的东西都整理出来,方便日后生疏了再回顾一下,顺便和大家一起交流学习。

在学三巨头之前,首先要知道正则表达式

正则表达式

什么是正则表达式?正则表达式又称规则表达式,通常用于判断语句中,是一种用于匹配字符串中字符组合的模式,一般由普通字符(字母、数字)与特殊字符(元字符)组成

我们之前讲过文件测试,是用 [ ]或者 test 实现的,还有学习 if 语句的时候,也是通过 [ ] 来进行条件判断。正则表达是也是用 [ ] 来做字符串匹配的,只不过,它所匹配的样式种类更多更齐全。

正则表达式直接使用的匹配规则是 

[[  变量  =~  正则式  ]]

一个例子,我们定义一个变量 num     看看它与正则式是否匹配,输出结果是匹配    

=~ 是匹配正则式的固定搭配,测试的时候不要忘了加

[0-9] 是检验变量里是否有0-9的数字

这里你可能会疑问,如果num = s2d2j93  这种数字字母穿插的,判断结果是什么呢?

答案是,仍然输出匹配, 因为 [0-9] 只看你的变量中有没有数字,我们之前在编写shell脚本的时候也遇到,一个猜数字的脚本,如何避免输入除数字外的其他字符呢?

现在可以得到解答了,只需要验证变量是否 =~ ^[0-9]+$  就可以了。

我们都知道,在grep命令中,^是以什么什么开头,而$是以什么什么结尾,这样一组合,是不是就通俗易懂了,以数字开头以数字结尾,那不就是匹配纯数字的字符串吗?

我们来正反都验证一下,结果不出我所料(doge

元字符

通过上面这个例子,想必应该对正则有了个大致的了解,其实并不困难,主要就是选项很多很杂,常见的元字符有

[ ]:定义一个字符类,匹配括号内的任意一个字符。

例如, [abc] 可以匹配 "a"、"b" 或 "c"

.:匹配除换行符之外的任何单个字符

例如, a.c 可以匹配 "abc"、"a1c"、"a@c" 等

*:匹配前面的元素零次或多次

例如, ab*c 可以匹配 "ac"、"abc"、"abbc"、"abbbc" 等

+:和 * 一样,但只能匹配前面的元素一次或多次,不包括零次

所以 ab+c 只可以匹配 "abc"、"abbc"、"abbbc" 等,不能匹配 "ac"

?:匹配前面的元素零次或一次

例如,ab?c 可以匹配 "ac" 或 "abc"

^:匹配字符串的开始。

例如, ^abc 匹配以 abc 开头的字符串。

$:匹配字符串的结束。

例如, abc$ 匹配以 abc 结尾的字符串。

[^]:定义一个否定字符类,匹配不在括号内的任意一个字符。

例如, [^abc] 匹配除了 "a"、"b" 和 "c" 之外的任意字符。

|:或操作符,匹配两者中的任意一个。

例如,正则表达式 abc|def 可以匹配 "abc" 或 "def"。

():分组,用于将多个元素组合成一个单元,并捕获匹配的文本。

例如, (abc)+ 可以匹配 "abc"、"abcabc" 等。

\{n\}:匹配前面的元素恰好 n 次。

例如, a{3} 可以匹配 "aaa"。

\{n,\}:匹配前面的元素至少 n 次。

例如, a{3,} 可以匹配 "aaa"、"aaaa"、"aaaaa" 等。

\{n,m\}:匹配前面的元素至少 n 次,但不超过 m 次。

例如, a{3,5} 可以匹配 "aaa"、"aaaa"、"aaaaa"。

\d:匹配任意一个数字字符(0-9)。

例如, \d 可以匹配 "1"、"2"、"3" 等。

\w:匹配任意一个字母、数字或下划线字符。

例如, \w 可以匹配 "a"、"1"、"_" 等。

\s:匹配任意一个空白字符(空格、制表符、换行符等)。

例如, \s 可以匹配空格、制表符等。

\D:匹配任意一个非数字字符。

例如, \D 可以匹配 "a"、"@"、" " 等。

其实还有一部分没有列出,基本上用不到,可能用到的就这么多了,万一有遗漏我后续会补上。

正则表达式的规则就这么多,大多数情况都是搭配三巨头使用的,所以说接下来就可以开始学习三巨头了,搭配 grep、sed、awk 等命令使用的时候,含义是不变的,但是使用的符号会有点出入,所以接下来就通过大量的实例来进行讲解。

grep

首先肯定是从我们最为熟知,也是使用过的 grep 命令开始,grep命令最常用的参数可能就是

grep -v 还有 grep -i 了,这两个都是它的基本选项,我们接下来要了解它的输出控制选项,所以说要和正则表达式搭配使用呢,一个负责筛选过滤,一个负责控制输出的内容。常用的有

-E :开启扩展的正则表达式

-c :计算找到 '搜寻字符串' 的次数

-o :只显示被模式匹配到的字符串

-w:匹配整个单词

-n :输出行号

我创建了一个 123.txt 文件,用来测试各种案例,你们可以直接复制粘贴使用

#123.txt

his is a test file for grep command.
t contains various patterns and special characters.

asic characters: abc, def, ghi
2. Digits: 123, 456, 789
3. Special characters: ., *, +, ?, ^, $, [, ], {, }, |, (, )
4. Word boundaries: start, end, middle
on-word characters: @, #, %, &, !
scaped characters: \., \*, \+, \?, \^, \$, \[, \], \{, \}, \|, \(, \)
ultiple lines with the same pattern:
   pattern
 pattern
 pattern
Case sensitivity: Case, case, CASE

Whole word matching: word, sword, reword
hole line matching: This is a whole line.
ontext lines:
 This is line before the match.
his is the matching line.
This is line after the match.
ile names: file1.txt, file2.txt, file3.txt
Directory names: dir1, dir2, dir3
xclude patterns: exclude this line
Include patterns: include this line
ecursive patterns:
    ./dir1/file1.txt
    ./dir2/file2.txt
    ./dir3/file3.txt
olor highlighting: highlight this
ount matching lines: count this line
Matching groups: group1, group2, group3
on-matching groups: nongroup1, nongroup2, nongroup3
ll
lol
lool
loool
loooool
looooool
looooooool
loooooooooooooooooool

案例

先来个简单的吧,找出 hole 并打印行号 

grep -n 'hole' 123.txt

打印出来有两个,此时我们加一个w,就可以只显示 hole 这个单词的了

那么相反,如果我查找不含 hole 的 只需要加上 -v 就可以了,也可以通过 [^] 来筛选前面不含w的

grep -n '[^w]hole'   (还有别的方法可以自己测试,比如[^a-z]hole,直接让前面不带字母等等)

接下来需要查找 test 或者 text 并打印行号(-n 之后的例子就不特别说明了)

grep -n 'te[sx]t' 123.txt

这里用到了[ ] ,匹配 s 或 x ,test 和 text 都被输出了出来

我们也可以通过 '.' 任意字符,来完成这个操作

grep -n 'te.t' 123.txt    有几个 . 就代表中间有几个任意字符

我们再来查找一下有数字的行       

  grep -n '[0-9]' 123.txt

下面我们来查找以数字开头的行

grep -n '^[0-9]' 123.txt

以此类推,假如以字母开头,那就是 ^[a-z]

那么,现在有一个疑问,假如要查找不以字母开头的呢?要知道,除了字母数字,还有特使字符和空格等开头的行,而且字母也是有大小写的,此时该怎么办呢?

原理也差不多,[^] 是过滤不含某些内容的,那我们就不含字母

grep -n '^[^a-zA-Z]' 123.txt         这个正则表达式同时过滤了小写字母和大写字母,如果连数

                                                  字也要过滤掉,那么就在a-zA-Z的随便哪个位置加上0-9就可

                                                  以了,顺序无所谓的,但最好按照a-z A-Z 的顺序,不然不确

                                                  定会不会出现什么问题

 附上过滤数字的运行截图

如果想查找以字母或数字结尾的,那么和以什么什么为开头的一样,在 [ ] 后面加上 $ 就可以了,如图,就不细说了↓

grep '[789]$' 123.txt 过滤出来是只有9是亮着的,因为 [ ] 匹配了 7 或者 8 或者 9 的字符串,那么,问一个简单的问题,假如我就非要,查找789这一个整体结尾的行,该怎么办呢?

额外提一句,grep -n '^$' 123.txt  代表输出空行的行

接下来,测试文件里的那么多 looool ,要派上用场了

回过头来看咱前面提到的元字符,是不是突然想到了什么

grep -n 'lo*l' 123.txt              grep -n 'lo+l' 123.txt

它们的输出结果应该 *  有ll,而 + 没有,除此之外输出结果应该一致

验证一下

一个新的问题出现了,为什么  grep -n 'lo+l' 123.txt  没有任何结果输出?我仅仅是将 * 号改成了+号,按理来说不可能出现语法错误啊?

我们来排错一下, grep -v 'lo+l' 123.txt  

整个文档都被输出出来了,说明文档里没有能与 'lo+l' 匹配的行,我们试着去文档里创捷新的一行,只有lo+l

保存并退出, 再来一次 grep -n 'lo+l' 123.txt 

真相了家人们,grep过滤的时候,读取的是 “lo+l” 这一整个字符串,+ 并没有被当作是元字符,我们给它加上一个 \ 转义符看看

这下成功了,得到想要的结果了,再回过头来看,是不是和 lo*l 的输出只相差了一个 ll

现在,我只想查找,ll之间夹着 3-6 个 o 的行

 grep -n 'lo\{3,6\}l' 123.txt

其他的需求也可以依葫芦画瓢,比如 至少 5个o 那就是 grep -n 'lo\{5,\}l' 123.txt , 转义符不要忘记

grep过滤的功能远不止在过滤文件内容,还可以搭配管道符号,再写入脚本,对脚本进行很大的优化

比如我们都知道,ifconfig ens33  是查看网卡的内容

那么,我们是不是可以通过一些条件约束,使之只显示我们需要的内容呢?比如说ip地址

很简单啊,过滤inet开头那一行,但是这样的输出结果,无法直接作为纯数字传递给脚本参数等进行处理,我们需要仅显示ip地址等

那么就需要过滤含有 [0-9].[0-9].[0-9].[0-9] 的行

 ifconfig ens33 |grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"

学好三巨头还是要靠熟记各种参数元字符的含义并巧妙应用,做到事半功倍的效果

另外还有sed 和 awk 我之后整理了差不多再进行讲解

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入分析 Android ContentProvider (八)

文章目录 深入分析 Android ContentProvider (八)ContentProvider 高级使用及最佳实践案例分析(续)1. 深入了解跨应用数据共享示例:跨应用数据共享的完整实现1. 定义权限2. 定义 ContentProvider3. ContentProvider 实现 2. 实践案例&#xf…

UG NX2406 安装教程

软件介绍 UG是一个交互式CAD/CAM(计算机辅助设计与计算机辅助制造)系统,它功能强大,可以轻松实现各种复杂实体及造型的建构。 它在诞生之初主要基于工作站,但随着PC硬件的发展和个人用户的迅速增长,在PC上的应用取得了迅猛的增长…

用TypeScript完成的贪吃蛇小游戏

食物类Fod // 定义 class Food {// 定义一个属性表示食物所对应的元素element:HTMLElement;constructor(){//加个!表示不能为空,非空断言操作符 //获取页面中的food元素并将其赋值给element this.elementdocument.getElementById(food)!;}// 定义一个获取食物x轴坐…

【C++】c++语法基础

引入&#xff0c;第一个c程序 这是用c写的helloworld程序 #include<iostream> using namespace std; int main() {cout << "hello,world\n" << endl;return 0;} 接下来我们将根据上述的代码来学习c的基本语法。 命名空间&#xff08;namespace…

PHP:连接钉钉接口-钉钉回调事件,本地测试数据

前置数据参考 数据说明:参见官方文档回调事件消息体加解密 - 钉钉开放平台 (dingtalk.com) URL后面带的参数: signature=5a65ceeef9aab2d149439f82dc191dd6c5cbe2c0&timestamp=1445827045067&nonce=nEXhMP4r Post参数: { "encrypt":"1a3NB…

日常开发记录分享——C#控件ToolTip实现分栏显示内容

文章目录 需求来源实现思路实施请看VCR等等别走&#xff0c;有优化 需求来源 需要在鼠标浮动到指定位置后提示出详细的信息&#xff0c;一开始使用的tooltip实现&#xff0c;但是里面的内容效果并不理想&#xff0c;需要有条理性&#xff0c;于是就想到能不能将展示的东西分列…

邮件推送API如何集成到现有系统发送邮件?

邮件推送API安全性策略&#xff1f;如何选择邮件推送API服务商&#xff1f; 在当今数字化时代&#xff0c;邮件通信是企业和个人交流的重要方式之一。集成邮件推送API到现有系统可以大大提升通信效率和自动化程度。AokSend将介绍如何将邮件推送API集成到现有系统中&#xff0c…

关于P2P(点对点)

P2P 是一种客户端与客户端之间&#xff0c;点对点连接的技术&#xff0c;在早前的客户端都是公网IP&#xff0c;没有NAT的情况下&#xff0c;P2P是较为容易实现的。 但现在的P2P&#xff0c;实现上面会略微有一些复杂&#xff1a;需要采取UDP打洞的技术&#xff0c;但UDP打出来…

自动控制: 时间最优的PID控制算法

自动控制&#xff1a; 时间最优的PID控制算法 在计算机控制系统中&#xff0c;时间最优控制旨在使系统从一个初始状态转到另一个目标状态所经历的过渡时间最短。利用最大值原理&#xff0c;可以设计出控制量只在 u ( t ) ≤ 1 u(t) \leq 1 u(t)≤1范围内取值的时间最优控制系…

(39)智能电池

文章目录 前言 1 通过任务规划器进行设置 2 补充信息 3 限制条件 4 参数说明 前言 虽然还不是很普遍&#xff0c;但智能电池更容易从飞行器上安装和拆卸&#xff0c;并且能够提供更多关于电池状态的信息&#xff0c;包括容量、单个电池电压、温度等。 ArduPilot 支持几种…

【分布式系统】 单机架构 | 分布式架构 | 集群 | 主从架构 | 分库分表 | 冷热分离 | 微服务

文章目录 [toc] 分布式系统一、单机架构二、分布式系统三、应用服务器集群四、读写分离 / 主从分离架构五、引入缓存/冷热分离架构六、垂直分库七、微服务架构——业务拆分代价优势 八、名词解释1.应用&#xff08;Application&#xff09;/系统(System)2.模块&#xff08;Mode…

解决“QtCreator无法呼出搜狗输入法“问题

由于在Ubuntu系统上&#xff0c;QtCreator软件默认使用IBus类型的输入法&#xff0c;而搜狗输入法是fcitx类型的&#xff0c;所以需要在Linux的系统设置 -->区域与语言 里 -->勾选 fcitx类型&#xff0c;如图(1)所示。     这里以QtCreator 4.5.2Ubuntu 18为例&#xf…

学习测试14-实战3-复习-使用CANoe打开半成品

数据 链接: https://pan.baidu.com/s/1k0SFq0luDvEbqimFgtfyKg?pwd9a5t 提取码: 9a5t 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 1&#xff0c;导入信号、报文、节点 2&#xff0c;导入数据库 3&#xff0c;导入can代码 4&#xff0c;导入环境变量 5&#x…

RTP协议基础

概述 1. 基本概念 RTP协议&#xff0c;全称为Real-time Transport Protocol&#xff08;实时传输协议&#xff09;是一种用于在IP网络上传输音频、视频等实时数据的网络协议。 在流媒体&#xff08;流媒体就是指可在线/实时观看音视频的互联网产品&#xff09;数据传输过程中&…

抄作业-跟着《React通关秘籍》捣鼓React-playground-上集

文章目录 前言1. 搭建react 开发环境2、react hooks 知识3. 目标&#xff1a;跟着小册实现 react-playground3.1 整体布局初始化项目使用Alloment 来实现左右分屏的拖拉功能 3.2 代码编辑器Monaco Editor 3.3 实现了多文件的切换用 useContext 来共享数据。优化 tab的样式&…

Vue响应式的原理

一. Vue响应式原理的核心概念 1. Vue响应式原理基于以下核心概念&#xff1a; ① 响应式对象&#xff1a;Vue使用Object.defineProperty()来 reactive&#xff08;反应&#xff09;对象中的属性&#xff0c;使其变化可以被检测。 注意&#xff1a; ★ Object.definePropert…

Python字符串处理技巧:一个小技巧竟然能省下你一半时间!

获取Pyhon及副业知识&#xff0c;关注公众号【软件测试圈】 效率翻倍的秘密&#xff1a;Python字符串操作的5个惊人技巧 在Python编程中&#xff0c;字符串处理在数据分析、Web开发、自动化脚本等多个领域都有广泛应用。Python提供了一系列强大的字符串处理函数&#xff0c;能够…

蚓链数字化生态平台:构建城市智能商业,引领协同发展新潮流

​在当今数字化飞速发展的时代&#xff0c;城市商业的运行模式正在经历着数字化变革。蚓链数字化生态平台应运而生&#xff0c;以其强大的功能和创新的理念&#xff0c;成为构建城市智能商业枢纽中心的关键力量&#xff0c;推动着平台互通、业务贯通、管理协同的全新发展格局。…

MySQL数据库-索引和视图

一、视图 1.什么是视图 MySQL中的视图&#xff08;view&#xff09;是一种虚拟表&#xff0c;其内容由查询定义&#xff0c;视图本身并不包含数据。视图看起来和真实的表完全相同&#xff0c;但其中的数据来自定义视图时用到的基本表&#xff0c;并且在打开视图时动态生成&am…

【JavaWeb项目】——外卖订餐系统之登入、登入后显示餐品信息、用户注册、注销部分

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…