grep的用法

2023-11-20

命令介绍

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。

grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

关于egrep:在此命令后跟的模板可以进行正则表达式的匹配

egrep = grep -E:扩展的正则表达式 (除了< , > , \b 使用其他正则都可以去掉\)

命令参数

常用参数已加粗

  • -A<显示行数>:除了显示符合范本样式的那一列之外,并显示该行之后的内容。
  • -B<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容。
  • -C<显示行数>:除了显示符合样式的那一行之外,并显示该行之前后的内容。
  • -c:统计匹配的行数
  • -e :实现多个选项间的逻辑or 关系
  • -E:扩展的正则表达式
  • -f FILE:从FILE获取PATTERN匹配
  • -F :相当于fgrep
  • -i --ignore-case #忽略字符大小写的差别。
  • -n:显示匹配的行号
  • -o:仅显示匹配到的字符串
  • -q: 静默模式,不输出任何信息
  • -s:不显示错误信息。
  • -v:显示不被pattern 匹配到的行,相当于[^] 反向匹配
  • -w :匹配 整个单词

应用示例

实例1—参数使用

#1.查看源文本
[root@blackstone test]# cat grep_basic
aaaaaaaa
bbbbbbbbbbbbbb
AAAAAAAaaaaaa
asczxcasBCXSDASCZADAD
SADASCZXCASD

#2.过滤包含字符b的行以及下两行
[root@blackstone test]# grep -A2 b grep_basic
bbbbbbbbbbbbbb
AAAAAAAaaaaaa
asczxcasBCXSDASCZADAD

#3.过滤包含字符b的行以及前1行
[root@blackstone test]# grep -B1 b grep_basic
aaaaaaaa
bbbbbbbbbbbbbb

#4.过滤包含b的行以及其上下两行
[root@blackstone test]# grep -C1 b grep_basic
aaaaaaaa
bbbbbbbbbbbbbb
AAAAAAAaaaaaa

#5.统计匹配的行数
[root@blackstone test]# grep -c aaa grep_basic
2

#6.使用e添加或或关系匹配的条目,即就是同时对AAA或者bbb进行筛选
[root@blackstone test]# grep -e AAA -e bbb grep_basic
bbbbbbbbbbbbbb
AAAAAAAaaaaaa

#7.筛选的同时显示行号并忽略大小写
[root@blackstone test]# grep -in b grep_basic
2:bbbbbbbbbbbbbb
4:asczxcasBCXSDASCZADAD

#8.筛选过程仅显示匹配到的部分
[root@blackstone test]# grep -o ADA grep_basic
ADA
ADA

#9.无输出筛选---主要用于shell编程中对返回值的判断确认信息的存在性
[root@blackstone test]# grep -q aa grep_basic

#10.进行取反显示,即就是匹配到的行不显示
[root@blackstone test]# grep -v aa grep_basic
bbbbbbbbbbbbbb
asczxcasBCXSDASCZADAD
SADASCZXCASD

#11.严格匹配字符,要求行内字符必须和模式完全一致
[root@blackstone test]# grep -w aa grep_basic
[root@blackstone test]# grep -w aaa grep_basic
[root@blackstone test]# grep -w aaaaaaaa grep_basic
aaaaaaaa

#12.使用文件进行匹配---通过以下的操作我们可以得知,文件内容匹配是默认的匹配方式
[root@blackstone test]# cat a.txt
aaaaaaaa
[root@blackstone test]# grep -f a.txt grep_basic
aaaaaaaa
[root@blackstone test]# vim a.txt
[root@blackstone test]# grep -f a.txt grep_basic
aaaaaaaa
AAAAAAAaaaaaa

实例2—正则使用

正则表达式在字符匹配中当然是不可或缺的存在,其实正则的概念很好理解,通过一系列符号去抓取一类文本的核心特征,从而对某一类文本进行特殊的操作。那么任意一个字符串其实都是可以通过正则进行表示的,单一字符+字符的出现次数就可以表示这个字符串的特征了。

1.元字符匹配

(1)格式

  • . 匹配任意单个字符,不能匹配空行
  • [] 匹配指定范围内的任意单个字符
  • [^] 取反
  • [:alnum:] 或 [0-9a-zA-Z]
  • [:alpha:] 或 [a-zA-Z]
  • [:upper:] 或 [A-Z]
  • [:lower:] 或 [a-z]
  • [:blank:] 空白字符(空格和制表符)
  • [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
  • [:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
  • [:digit:] 十进制数字 或[0-9]
  • [:xdigit:]十六进制数字
  • [:graph:] 可打印的非空白字符
  • [:print:] 可打印字符
  • [:punct:] 标点符号

(2)应用示例

#查看源字符文件
[root@blackstone test]# cat grep_regular
abxc
123456

//a
[]
,.;'[]

#1.使用.匹配字符,由于.匹配任意字符,故可以到文本中的文字均被标红
[root@blackstone test]# grep . grep_regular

在这里插入图片描述

#2.打印出除了abc以外的所有字符
[root@blackstone test]# grep -o [^abc] grep_regular
#3.过滤显示文本中所有的[0-9a-zA-Z]范围的字符
[root@blackstone test]# grep  -o [[:alnum:]] grep_regular
#4.过滤显示出文本中所有的标点符号
[root@blackstone test]# grep  -o [[:punct:]] grep_regular

在这里插入图片描述

2.字符出现次数

(1)格式

  • ***** 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
  • .* 任意前面长度的任意字符,不包括0次
  • ? 匹配其前面的字符0 或 1次
  • + 匹配其前面的字符至少1次
  • {n} 匹配前面的字符n次
  • {m,n} 匹配前面的字符至少m 次,至多n次
  • {,n} 匹配前面的字符至多n次
  • {n,} 匹配前面的字符至少n次

(2)示例

#查看原文本
[root@blackstone test]# cat grep_01
ggle
gogle
google
gooooooooooooooooooooooooooogle
gagle

#1.过滤字符中的o出现次数为0次或多次
[root@blackstone test]# grep "g[o]*gle" grep_01
ggle
gogle
google
gooooooooooooooooooooooooooogle

#2.过滤字符o的次数大于等于1
[root@blackstone test]# grep "g[o].*gle" grep_01
gogle
google
gooooooooooooooooooooooooooogle

#3.问号匹配0/1次前置字符,这里由于在grep中执行故需要加\进行转义
[root@blackstone test]# grep "g[o]\?gle" grep_01
ggle
gogle

#4.使用+匹配前置字符大于等于1次,同样使用\进行转义
[root@blackstone test]# grep "g[o]\+gle" grep_01
gogle
google
gooooooooooooooooooooooooooogle

#5.匹配次数区间为[1,2]其中{}符号添加\进行转义
[root@blackstone test]# grep "g[o]\{1,2\}gle" grep_01
gogle
google

#6.使用-E或者egrep直接支持正则进行匹配
[root@blackstone test]# grep -E "g[o]{10,}gle" grep_01
gooooooooooooooooooooooooooogle

[root@blackstone test]# egrep  "g[o]{10,}gle" grep_01
gooooooooooooooooooooooooooogle

[root@blackstone test]# egrep "g[o]{,10}gle" grep_01
ggle
gogle
google

3.位置界定符号

(1)格式

  • ^ 行首锚定,用于模式的最左侧
  • $ 行尾锚定,用于模式的最右侧
  • ^PATTERN$ 用于模式匹配整行
  • ^$空行
  • ^[[:space:]].*$ 空白行
  • < 或 \b 词首锚定,用于单词模式的左侧
  • > 或 \b 词尾锚定;用于单词模式的右侧

(2)演示

[root@blackstone test]# cat grep_02
aaa




bbbbbb
aczxcsdasdasfascac

#1.匹配以a开头的行
[root@blackstone test]# grep ^a grep_02
aaa
aczxcsdasdasfascac

#2.匹配以b结尾的行
[root@blackstone test]# grep b$ grep_02
bbbbbb

#3.匹配以a开头以c结尾的行
[root@blackstone test]# grep "^\<a.*c\>$" grep_02
aczxcsdasdasfascac

#4.匹配空行
[root@blackstone test]# grep ^$ grep_02
空行1
空行2
空行3

关于空白行的匹配:在文档内部一致敲空格代替输入

[root@blackstone test]# grep ^[[:space:]].*$ grep_02

在这里插入图片描述

4.分组与向后引用

(1)格式
分组:() 将一个或多个字符捆绑在一起,当作一个整体进行处理。分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …

向后引用: 引用前面的分组括号中的模式所匹配字符,而非模式本身

  • \1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
  • \2 表示从左侧起第2个左括号以及与之匹配右括号之间的模式所匹配到的字符,以此类推
  • & 表示前面的分组中所有字符

工作流程:前面匹配的内容可以通过进行一个()进行整合,定义为\数字在之后的正则中可以进行引用,以简化正则的重复书写
在这里插入图片描述
(2)简单应用示例

[root@blackstone test]# cat grep_03
hello world hello world
hiiiii world hiii world
hello world heiii wwwww

#1.匹配含有he的行
[root@blackstone test]# grep "\(he\)" grep_03

#2.对he结果进行分组,在后续的匹配中进行引用,形成包夹型的匹配字符
[root@blackstone test]# grep "\(he\).*\1" grep_03

#3.设置多个分组并向后引用第二组进行字符匹配
[root@blackstone test]# grep "\(he\).*\(wo\).*\2" grep_03

在这里插入图片描述
建议:个人觉得这个分组引用一定程度上可以减小正则的书写长度,但是还有有些过于费解,掌握前三个就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

grep的用法 的相关文章

  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • Linux 文本文件操作

    我有一个格式的文件 a href a href a href a href 我需要选择 之后但 之前的文本 并将其打印在行尾 添加后 例如 a href http www wowhead com search Su a a a a a
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • sqlite 插入需要很长时间

    我正在将不到 200 000 行插入到 sqlite 数据库表中 我只是在终端中通过 sqlite3 使用一个非常简单的 sql 文件 我打赌它已经运行了至少 30 分钟 这是正常现象还是我应该关闭该过程并尝试不同的方法 sqlite中的插
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0
  • 使用命令行将 MediaWiki 维基文本格式转换为 HTML

    我倾向于编写大量文档 因此 MediaWiki 格式对我来说很容易理解 而且比编写传统 HTML 节省了我很多时间 然而 我也写了一篇博客 发现一直从键盘切换到鼠标来输入正确的 HTML 标签会增加很多时间 我希望能够使用 Mediawik
  • 无关的库链接

    我有一个可能有点愚蠢的问题 因为我很确定我可能已经知道答案了 假设你有静态库A 动态共享库B和你的linux下的程序C 假设库 A 调用库 B 中的函数 并且您的程序调用库 A 中的函数 现在假设 C 在 A 中调用的所有函数都不使用 B
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • 为 Linux 安装 R 包时出错

    我试图在 R 3 3 上安装一个名为 rgeos 的包 但是当我输入 install packages rgeos 但它返回给我以下错误 其他包也会发生同样的情况 但不是所有包 gt installing source package rg
  • Scrapy FakeUserAgentError:获取浏览器时发生错误

    我使用 Scrapy FakeUserAgent 并在我的 Linux 服务器上不断收到此错误 Traceback most recent call last File usr local lib64 python2 7 site pack
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • numpy 未定义符号:PyFPE_jbuf

    我正在尝试使用一百万首歌曲数据集 为此我必须安装 python 表 numpy cython hdf5 numexpr 等 昨天我设法安装了我需要的所有内容 在使用 hdf5 遇到一些麻烦之后 我下载了预编译的二进制包并将它们保存在我的 b
  • 如何获取 linux 实用程序 tail 的源代码?

    这个命令确实非常有用 但是我可以在哪里获取源代码以查看内部发生的情况 thanks tail 实用程序是 Linux 上 coreutils 的一部分 源压缩包 ftp ftp gnu org gnu coreutils coreutils
  • 如何让 clangd 转向 c++20

    当没有其他信息时 如何让 clangd 回退到 c 20 例如 在第一次构建之前 cmake 可以生成一个 这是在带有最新 LLVM 的 Arch Linux 上 这是通过 Emacs LSP 运行的 但这应该没有什么区别 你可以加 Com
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显
  • 停止服务时单元陷入故障状态(状态=143)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是我的问题 我有 CentOS 和 java 进程在上面运行 Java进程是通过启动 停止脚本来操作的 它也创建了 java 实例的 p
  • 为什么在 Linux 上字符串文字的内存地址与其他字符串文字的内存地址如此不同?

    我注意到字符串文字在内存中的地址与其他常量和变量 Linux 操作系统 非常不同 它们有许多前导零 未打印 Example const char h Hi int i 1 printf p n void h printf p n void
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 如何不断刷新屏幕并实时更新[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在linux上写一个C程序 不断刷新屏幕并实时更新 例如类似于top终端中的命令 谁能指出我正确的方向 为了保持它跨终端类型的可移
  • 在 Ubuntu 16.04 上找不到 printf.c

    我最近切换到Ubuntu 16 04 我在用vscode作为 Ubuntu 上的 IDE 我配置了其他语言 但我无法做到这一点C C 我创建c cpp properties json launch json tasks json 当我开始编

随机推荐

  • Jupyter notebook的使用

    1 参考博客 https www cnblogs com nxld p 6088003 html 一 两种方式 1 启动cmd 然后输入命令 jupyter notebook 就可以直接调转到网页 因为这是在网页上直接运行的 2 一般启动程
  • 试题 B: 顺子日期

    问题描述 小明特别喜欢顺子 顺子指的就是连续的三个数字 123 456 等 顺子日 期指的就是在日期的 yyyymmdd 表示法中 存在任意连续的三位数是一个顺 子的日期 例如 20220123 就是一个顺子日期 因为它出现了一个顺子 12
  • Git代码拉取与同步

    1 git clone email protected xxx xxx git 2 git checkout b dev origin dev 创建本地dev分支 并与远程dev分支关联 3 git remote add upstream
  • 如何做单元测试

    如何做单元测试 一 定义 二 为什么要做单元测试 三 单元测试用例 四 阿里单元测试规约 五 测试框架的使用 Junit 下面以Junit4 为例来介绍 1 1 什么是Junit 1 2 为何使用Junit 1 3 Junit的快速入门 导
  • 学习笔记——SVG.js中形状元素的创建及其相关方法

    CreateElement 1 创建svg元素 在svg js中 每个元素都是一个对象 可以通过构造它来创建 import Rect from svgdotjs svg js var rect new Rect size 100 100 a
  • Unity3d中脚本无法编译问题(Monodevelop)

    使用Monodevelop打开脚本 编译时报错 具体错误忘记了 原因是 net框架引起 升级到 net框架4 5后解决
  • centos 7安装BBR加速报错:sysctl: setting key “net.ipv4.tcp_congestion_control“: 没有那个文件或目录的修复方法

    uname r 查看一下内核是什么版本 这个报错无非就是你内核不是4 9以上 从以下链接进去重启系统更新超过4 9内核就好 我升级后是5 14 成功运行 CentOS 7 启动 BBR 教程
  • 主成分分析R语言实现

    主成分分析是一种常见的降维统计方法 它通过适当的变量替换 使得新变量成为原变量的线性组合 并且新变量间彼此独立 从而可从错综复杂的关系中寻求主要成分信息 揭示变量内在关系 本次主要分享的是该方法的R语言实现 目录 数据集展示 一 计算相关系
  • win10安装mujoco150 , mujoco_py1.50.1.68 , gym

    win10安装mujoco mujoco py gym 本文介绍的是在Win10系统下安装gym mujoco150 mujoco py1 50 1 68的具体流程 另外一篇是安装mujoco200和mujoco py2 0 2 9版本 方
  • 爬虫超简化详细流程

    第一章 爬取网页源代码 一 导入模块 使用pip命令模块在电脑终端 下载基础爬取所用模块 requests import requests 二 放置网址 单引号中放置网址 url 三 设置请求头 headers Accept 辨识内容为全部
  • am335x+wm8960音频基于linux 4.9.41移植

    1 配置内核驱动 gt Device Drivers gt Sound card support SOUND y
  • IMX6学习记录(7)-编译脚本

    上面是我的微信和QQ群 欢迎新朋友的加入 1 效果 这几天搞这个东西 会有一大堆的命令行操作 很多重复的内容 现在做一个简单的脚本 方便自己平时的开发工作 2 脚本内容 bin bash uboot编译 function mk uboot
  • Django form组件

    form组件博客整理一 背景 我们之前在HTML页面中利用form表单向后端提交数据时 都会写一些获取用户输入的标签并且用form标签把它们包起来 与此同时我们在好多场景下都需要对用户的输入做校验 比如校验用户是否输入 输入的长度和格式等正
  • IDEA找不到程序包 和 request.getServletContext()报错Cannot resolve method ‘getServletContext()的解决方法

    重新装了idea和down了项目却一直报错 在调用request getServletContext 的方法时一直报Cannot resolve method getServletContext 的错误 网上查了好多方法 大多数都是在说是s
  • ModuleNotFoundError: No module named ‘tensorflow.contrib‘

    代码错误 Traceback most recent call last File D PyCharm PythonProject DRL Networking master DRL Networking master IPDPS2020
  • Android4.0 SDK功能详解

    我在eoe的论坛找到的 就复制过来了 跟大家分享一下 Android 4 0 平台API等级 14 Android 4 0 是一次重要的平台发布版 为用户和应用程序开发者增加了大量的新特性 在下面我们将讨论的所有新特性和API中 因为它将
  • 【C++】C++11语法之右值引用

    文章目录 一 的扩展 initializer list的讲解 二 C 11一些小的更新 decltype nullptr 范围for 新容器 三 右值引用 右值真正的用法 完美转发 默认成员函数 总结 一 的扩展 在原先c 的基础上 C 1
  • 操作系统:进程学习笔记

    前言 程序顺序执行的三大特性 1 顺序性 指处理机严格按照程序所规定的的顺序执行 2 封闭性 指程序在封闭的环境运行即程序运行时独占全机资源 资源状态只能有本程序才能够改变它 程序一旦执行 其运行结果不受外界影响 3 可再现性 指只要程序执
  • 编写Shell脚本(批处理,一次执行多条命令)

    Bash终端的优势 1 上下键重复执行命令 2 tab键自动补齐 3 提供有用的环境变量 4 批处理 shell脚本文件建议以 sh为后缀 其实vim创建文本文件时 对名字无要求 但最好规定格式 echo SHELL 输出为 bin bas
  • grep的用法

    命令介绍 Linux系统中grep命令是一种强大的文本搜索工具 它能使用正则表达式搜索文本 并把匹配的行打印出来 匹配到的标红grep全称是Global Regular Expression Print 表示全局正则表达式版本 它的使用权限