Linux中grep函数的一些常见问题

2023-11-10

        linux中grep 的详细用法已经有许多人介绍过了,本文是作者在学习过程中的总结和对原文中一些没有被提及或者含糊不清的概念的理解。

一、grep概述

        grep的全称是global regular expression print,即全局正则表达式显示,grep接受一个字符串,在全文中搜索这个字符串或这个字符串表达的正则表达式。上面这句话有两个关键点:

        1. 正则表达式本质上是一个字符串,例如"a*b",当一个字符串被当作正则表达式,其中的一些文本字符,如“*”等,就变为了正则表达式的元字符。

        2. grep函数接受一个字符串,并把它当作正则表达式

二、文本字符,元字符,通配符的区别

        一个字符串中所有字符都是文本字符,当它被当作正则表达式用于文本检索时,其中的一些文本字符就变为了正则表达式特有的元字符;当它被用作检索文件名,其中的一些文本字符就变为了shell可以识别的通配符。总结如下:

        1. 字符+元字符 = 正则表达式,用于文本的检索

        2. 字符+通配符 = 用于文件或目录的检索

        下表列出了全部元字符,和部分通配符。可以看到元字符和通配符有一部分是重合的,但是他们的表达的含义却不一定相同,例如中括号[ ]在两边表示的意思都是“匹配中括号里的任意一个”,而星号“*”当作元字符时表示“匹配任意个星号前面的字符”,而当作通配符时表示“匹配任意个任意字符”。

元字符 通配符
^ $ . [ ] { } - ? * + ( ) | \ * ? [ ] \ [^] [[:digit:]]

        注:通配符中[[:digit:]]表示匹配一个数字,诸如此类的还有[[:space:]]表示匹配一个空格等等。

三、使用grep为什么要对字符串加引号?

        因为这部分又可以当作元字符又可以当作通配符的字符,有些情况下shell会错误的将一个字符当作通配符或元字符,因此grep的字符串的输入最好加上引号。   

        下面说明一种shell错误识别元字符和通配符的情况。当输入的字符串中包含空格,shell会将空格后的字符串当作需要检索的第一个文件,而将其中的元字符当作通配符。

        加引号不是强制的,而是为了避免未预见的麻烦。      

四、加引号加单引号和双引号有什么区别?

        这里的区别就是一般Linux教程说明的单引号和双引号的区别:单引号不对文本处理,所有字符都是普通的字符,双引号将其中的$\`视为特殊的字符。

        从上图可以看出,双引号中用实际的值替换$标注变量val,用命令的执行的结果替换倒引号``括起来的命令,用转义的结果替换反斜杠\后的字符,而单引号什么都不做。

        前面第一节说到,grep的输入是一个字符串,纯文本,那么如果用双引号,双引号中的$\`的替换是优先于grep检索的,也是说双引号中字符串的执行结果才是grep的输入字符串。一般的过程是:先由双引号进行内部替换和倒引号执行,得到纯文本的字符串,再将字符串作为grep,fgrep,egrep的输入

                        

        上图可以看出,双引号中的第1,3个反斜将第2,4个转义后相当于单引号括起来的‘a\\’。要表示匹配‘a\’,单引号只需要两个反斜杠,而双引号需要四个,因此无特殊需求为方便起见建议直接用单引号

附:三种引号:倒引号`,单引号',双引号",倒引号将其中字符当作shell指令,单引号当作纯字符串,双引号也是当作字符串,不过会将其中的变量引用$,命令`(倒引号包含的字符串),转义符\这三者自动替换成变量引用的结果,命令的执行结果,转义后的结果后再当作一个字符串。

五、元字符和扩展元字符

        扩展的元字符是在一般正则表达式中无法识别,grep只能识别一般元字符,把扩展的元字符当作一般字符。

                ​​​​​​​        ​​​​​​​        

        扩展元字符“?”表示“匹配0或1个前面的字符”,上图可以看出grep不认识扩展元字符“?”,而将他当作普通字符,用“\”可以将元字符变为扩展元字符(如2),或者直接用扩展元字符的模式搜索(如3)。

六、grep,egrep和fgrep

fgrep 将字符串当作一般字符,即取消任何元字符的特殊含义,但不能阻止双引号对其内部特殊字符的解释。

grep 将字符串当作一般字符元字符

egrep 将字符串当作一般字符元字符扩展元字符

七、在grep中反斜杠\作用

1. 作用于文本字符:变为扩展元字符(仅用于grep不能识别而当作普通字符的扩展元字符)。

2. 作用于元字符:变为文本字符,取消特殊含义。(这里也可以用方括号[ ]变为普通字符,例如[\]就相当于匹配一个反斜杠)

若有问题可以评论区交流,谢谢。

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

Linux中grep函数的一些常见问题 的相关文章

  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • 如何确保应用程序在 Linux 上持续运行

    我试图确保脚本在开发服务器上保持运行 它会整理统计数据并提供网络服务 因此它应该会持续存在 但一天中有几次 它会因未知原因而消失 当我们注意到时 我们只需再次启动它 但这很麻烦 并且某些用户没有权限 或专有技术 来启动它 作为一名程序员 我
  • CoAP数据包的大小是多少?

    我是这项技术的新手 有人可以帮助我了解一些疑问吗 Q 1 CoAP数据包的大小是多少 我知道有 4 字节固定标头 但是包括标头 选项和负载在内的最大大小限制是多少 Q 2 有像MQTT那样的Keep Alive的概念吗 它在UDP上工作 它
  • Gtk-ERROR **:检测到 GTK+ 2.x 符号

    我正在使用 gcc 编译我的 c 应用程序 并使用以下标志 gcc evis c pkg config cflags libs gtk 2 0 libs clutter gtk 1 0 libs gthread 2 0 Wall o evi
  • 是否可以创建一个脚本来保存和恢复权限?

    我正在使用 Linux 系统 需要对一组嵌套文件和目录进行一些权限实验 我想知道是否没有某种方法可以保存文件和目录的权限 而不保存文件本身 换句话说 我想保存权限 编辑一些文件 调整一些权限 然后将权限恢复到目录结构中 将更改的文件保留在适
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • 我不明白 execlp() 在 Linux 中如何工作

    过去两天我一直在试图理解execlp 系统调用 但我还在这里 让我直奔主题 The man pageexeclp 将系统调用声明为int execlp const char file const char arg 与描述 execl exe
  • waitpid() 的作用是什么?

    有什么用waitpid 它通常用于等待特定进程完成 或者如果您使用特殊标志则更改状态 基于其进程 ID 也称为pid 它还可用于等待一组子进程中的任何一个 无论是来自特定进程组的子进程还是当前进程的任何子进程 See here http l
  • 在退出脚本之前等待后台进程完成

    在退出脚本 TCL Bash 之前 如何确保所有后台进程已完成执行 我正在考虑将所有后台进程 pid 写入 pid 文件 然后最后 pgrep pidfile 以查看在退出之前是否有任何进程仍在运行 有一些更简单的方法可以做到这一点吗 TC
  • 在 Mac OSX 上交叉编译 x86_64-unknown-linux-gnu 失败

    我尝试将我的 Rust 项目之一编译到 x86 64 unknown linux gnu 目标 cargo build target x86 64 unknown linux gnu Compiling deployer v0 1 0 fi
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • Python 脚本作为 Linux 服务/守护进程

    Hallo 我试图让 python 脚本作为服务 守护进程 在 ubuntu linux 上运行 网络上存在多种解决方案 例如 http pypi python org pypi python daemon http pypi python
  • 警告:请求的映像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配

    警告 请求的映像平台 linux amd64 与检测到的主机平台 linux arm64 v8 不匹配 并且未请求特定平台 docker 来自守护程序的错误响应 无法选择具有功能的设备驱动程序 gpu 我在 mac 上尝试运行此命令时遇到此
  • 每个命令都返回“bash:<命令>:找不到命令...”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我刚刚安装了 Scala 并添加了路径gedit bashrc export SCALA HOME home avijit sca
  • Gearman,php 扩展问题:使用终端在 .. 中找不到类“GearmanWorker”,但可以在浏览器上使用

    我最近在 ubuntu 10 04 上安装了 gearman 并安装了它的 pecl 扩展 现在 当我在浏览器中运行一个 php 文件时 其中包含 client new GearmanWorker die var Dump client I
  • vagrant ssh -c 并在连接关闭后保持后台进程运行

    我正在编写一个脚本来启动和后台流浪机器内的进程 似乎每次脚本结束和 ssh 会话结束时 后台进程也会结束 这是我正在运行的命令 vagrant ssh c cd vagrant src nohup python hello py gt he
  • Fedora dnf 更新不起作用?

    当我尝试使用 update 命令更新 Fedora 22 时 sudo dnf update 我收到以下错误 错误 无法同步存储库 更新 的缓存 无法准备内部镜像列表 Curl 错误 6 无法解析主机名 无法解析主机 mirrors fed
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • ARM架构内核启动分析-head.S(1.1、vmlinux.lds 链接脚本分析)

    ARM架构内核启动分析 一 start kernel之前 首先需要明确的是 内核镜像在被解压之后执行 是执行哪段代码 这是个重要的问题 平时在编译生成应用程序或内核模块时 我们无需考虑链接的具体细节 如代码和数据放在哪里 代码执行入口在哪等
  • Java8 并行流(parallelStream)原理分析及注意事项

    文章目录 前言 一 parallelStream是什么 二 parallelStream原理分析 1 Fork Join框架 1 1 work stealing 工作窃取算法 1 2 常用方法 2 实例演示 2 1 提交有返回值的任务 2
  • 当面试官说 “你还有什么问题想问的” ,你该如何回答?

    程序员面试时经常会听到面试官说一些套话 比如 今天的面试就到这里了 回去等通知吧 你还有什么问题想问我的吗 如果这道题不会做 那么我们也可以换一道 今天我们要说的是大多数面试官都会说的一句话 你还有什么问题想问的 这是一个老生常谈的问题 之
  • java.lang.UnsupportedOperationException解决方法

    项目中我需要一个ArrayList数组存放多个实体类对象 其中2个实体类对象是初始化时就需要存进去 另外的需要从另一个List循环提取数据存放 为了编码简洁使用了Arrays asList List
  • qt如何清除所有断点

    1 右键打开Breakpoints窗体 2 随便在一个断点上右键 3 选择Delete All Breakpoints即可
  • Java的动态特性(代码示例)

    Java是一种静态类型语言 其变量在编译时需要明确声明类型 并且类型检查是在编译时进行的 然而 Java也具有一些动态特性 允许在运行时进行类型检查和动态处理对象 下面是几个Java语言的动态特性以及相应的代码示例 反射 Reflectio
  • 2023-9-10 Nim游戏

    题目链接 Nim游戏 include
  • 正则数字和小数点_正则实践与详解

    一 关于数字 1 全为数字 d d 匹配数字 a 0或多次a a a开头 a a结尾 2 至少n位数字 d n a n a指定n次 a n a至少n次 a n m a指定n到m次 3 非零开头的数字 1 9 d xyz 字符集合 匹配其中任
  • java Web实现用户登录功能

    文章目录 一 纯JSP方式实现用户登录功能 一 实现思路 1 创建Web项目 2 创建登录页面 3 创建登录处理页面 4 创建登录成功页面 5 创建登录失败页面 6 编辑项目首页 三 测试结果 二 JSP Servlet方式实现用户登录功能
  • mysql清空表数据后如何让自增ID仍从1开始

    mysql清空表数据后如何让自增ID仍从1开始 也就是说如何重排auto increment 重排auto increment有2种方法 1 清空表时使用truncate命令 而不用delete命令 mysql gt truncate te
  • staruml怎么设置为中文_Ubuntu 系统设置为中文

    1 首先点击系统右上方倒三角 展开详细功能菜单 gt 点击 Settings gt 打开设置界面 2 设置界面左侧点击 Region Language 显示区域与语言设置面板 gt 点击 Manage Installed Languages
  • jenkins+allure,生成的allure报告打开空白

    问题 jenkins allure 生成的allure报告打开空白 分析过程 第一步 判断配置中的执行命令是否正确 命令行分析 cd auto INC MTISP CORE mtisp auto lqx 切换到我实际需要执行的包的路径下 D
  • K8S搭建以及使用

    组件 1 主机 Master 用于控制整个Kubernetes集群 2 节点 node 负责执行请求和分配所有任务的节点 3 容器集 Pod 部署在 node 节点上 且包至少含一个或多个容器 同一个容器集中的所有容器共享同一个IP地址 主
  • axes don‘t match array

    axis don t match array的问题 写一个神经网络进行图像分类 在读取数据的部分报错如下 1 numpy core exceptions UFuncTypeError Cannot cast ufunc subtract o
  • Linux(ubuntu)内容整理(常用命令)

    1 基础快捷键 命令 含义 ctrl c 强制停止 ctrl d 退出登出 histroy 查看历史命令 命令前缀 自动匹配上一个命令 ctrl r 搜索历史命令 ctrl a e 光标移动到命令开始或结束 ctrl 箭头 左右跳单词 ct
  • vue的学习与使用

    目录 基础语法 判断与循环v if v else for if for 事件 v on Vue双向绑定 Vue组件 计算属性 插槽 slot 自定义事件内容分发 创建一个vue程序 Webpack 什么是webpack 安装Webpack
  • 【VISIO安装问题】无法安装64位版本的office,因为在您的PC上找到以下32位程序

    无法安装64位版本的office 因为在您的PC上找到以下32位程序 当我们想要安装visio 64位程序的时候 我们的电脑提示这种错误 可能是我们电脑上32位 visio程序并未删除干净 直接卸载电脑上的32位visio程序有时候可能卸载
  • 严重: testWhileIdle is true, validationQuery not set ;使用连接池错误(无Spring框架,使用的JDK9,MYSQL8版本)

    在properties配置文件下添加一些配置 driverClassName com mysql cj jdbc Driver url jdbc mysql localhost 3306 javaweb userSSL true serve
  • C++ decltype用法详解

    1 什么是decltype decltype是C 11新增的一个关键字 和auto的功能一样 用来在编译时期进行自动类型推导 引入decltype是因为auto并不适用于所有的自动类型推导场景 在某些特殊情况下auto用起来很不方便 甚至压
  • Linux中grep函数的一些常见问题

    linux中grep 的详细用法已经有许多人介绍过了 本文是作者在学习过程中的总结和对原文中一些没有被提及或者含糊不清的概念的理解 一 grep概述 grep的全称是global regular expression print 即全局正则