首页 > 系统相关 >记 grep命令在Ubuntu上使用失败的问题

记 grep命令在Ubuntu上使用失败的问题

时间:2023-11-08 12:22:31浏览次数:27  
标签:grep 编程语言 正则表达式 使用 Perl 失败 Ubuntu 匹配

问题/任务

我有一个任务,要用shell命令从文本文件中提取ip地址,文本文件内容就像这样:

185.155.192.77 - - [17/Jul/2023:02:27:22 +0000] "GET / HTTP/1.1" 404 1234

我想到可以用grep 来实现,找到一个ip地址的正则表达式,用来提取ip正好,命令行是这样:

grep -E -o '\b(?:\d{1,3}.){3}\d{1,3}\b' access.log

在mac 上 执行的很成功,但是当我在Ubuntu执行时,grep没有返回任何结果,到底是什么环节出了问题?

解决过程

请教chatgpt,gpt给出了几个可能的原因,前2个分别是:正则语法错误/版本兼容问题,Ubuntu 上的grep使用基本的正则表达式,如要使用Perl 兼容的正则,需要加 -P

grep -P -o '\b(?:\d{1,3}.){3}\d{1,3}\b' access.log

问题完美解决。那么2个环境的grep 有什么不同呢?

在mac上,grep --version

grep (BSD grep, GNU compatible) 2.6.0-FreeBSD

在Ubuntu上,grep --version

grep (GNU grep) 3.4
两者版本差别还是挺大的,看来写Shell 脚本需要特别处理这种兼容性问题!

后来

什么是Perl兼容的正则表达式?来自gpt的回答是这样:

Perl兼容的正则表达式是一种正则表达式的语法,它与Perl编程语言中使用的正则表达式语法兼容。Perl正则表达式在文本处理和模式匹配中非常强大和灵活,因此被广泛用于许多编程语言和工具中,不仅限于Perl自身。

Perl兼容的正则表达式通常支持以下功能:

  1. 元字符:像.*+? 等常见的元字符用于匹配字符和重复。
    2. 字符类:使用[]来指定一个字符集合,如[a-zA-Z]表示匹配任何大小写字母。
    3. 锚点:使用^(开始)和$(结束)来匹配文本的开头和结尾。
    4. 分组:使用()来创建捕获组,可以在匹配后引用它们。
    5. 量词:使用{}来指定重复次数,如{1,3}表示重复1到3次。
    6. 转义字符:使用\来转义特殊字符,以便匹配它们本身。
    7. 或运算:使用|来表示逻辑或,例如cat|dog表示匹配"cat"或"dog"。
    8. 后向引用:捕获组可以在模式中后向引用,允许你匹配先前捕获的文本。
    9. 零宽断言:使用特殊的断言如(?=...)(正向先行断言)和(?!...)(负向先行断言)来查找特定条件而不消耗输入。
    10. 修饰符:使用修饰符(如i表示不区分大小写,m表示多行模式)来调整匹配行为。

因为Perl正则表达式语法非常强大,所以它在文本处理和模式匹配任务中非常有用,被许多编程语言和工具所采纳和实现,包括Python、Java、JavaScript等。它是一个功能丰富的工具,可以用于字符串匹配、文本解析、数据提取等各种任务。如果你要在特定的编程语言中使用Perl兼容的正则表达式,你需要查看该语言的文档,以了解如何使用和实现这些正则表达式。因为Perl正则表达式语法非常强大,所以它在文本处理和模式匹配任务中非常有用,被许多编程语言和工具所采纳和实现,包括Python、Java、JavaScript等。它是一个功能丰富的工具,可以用于字符串匹配、文本解析、数据提取等各种任务。如果你要在特定的编程语言中使用Perl兼容的正则表达式,你需要查看该语言的文档,以了解如何使用和实现这些正则表达式。

标签:grep,编程语言,正则表达式,使用,Perl,失败,Ubuntu,匹配
From: https://www.cnblogs.com/monster1799/p/17817110.html

相关文章

  • 华为云ubuntu1804安装rancherk8s
    apt-getinstalldocker.iodockerversionClient:Version:20.10.21APIversion:1.41Goversion:go1.18.1Gitcommit:20.10.21-0ubuntu1~18.04.3Built:ThuApr2705:50:212023OS/Arch:linux/amd6......
  • Teamcenter bmide 部署失败的修复方法
    出现了错误后,是否要还原TC库?部署失败后,是否可以直接修复错误?回答:可以直接修复错误,只有在万不得已的情况下,才还原TC库。特别说明:做BMIDE修复之前,一定要做好相关备份,如果是虚拟机,就先做快照最常见的错误修复:1.将已经部署的普通属性修改为数组属性(或者反之)热部署操作:先将原来的......
  • Linux学习笔记之grep满足或排除多个关键字
    grep-E"word1|word2|word3"file.txt#满足任意条件(word1、word2和word3之一)将匹配。grepword1file.txt|grepword2|grepword3#必须同时满足三个条件(word1、word2和word3)才匹配。 #grep同时排除多个关键字#不说废话,例如需要排除abc.txt中的mmmnnngr......
  • Oracle IMP-00010: 不是有效的导出文件,标题验证失败
    大概有两种情况:1.imp/exp的版本不对,也就是说低版本的导出,可以用高版本的导入,但高版本导出不能用低版本的导入,这个版本不只是指imp/exp的版本,也是指数据库的版本。也就是说,低版本的SQLDeveloper/Oracledatabase/Oracleclient导出的dmp文件,可以导入到高版本的SQLDeveloper/Orac......
  • Ubuntu 包管理工具
    apt源的管理每个Ubuntu版本都有自己的一组四个官方存储库:Main–Canonical支持的自由开源软件Universe–社区维护的自由开源软件Restricted–设备的专有驱动程序Multiverse–受版权或法律问题限制的软件常用命令aptaptlist--installedaptinstallcudaapt--purgere......
  • 配置使用百度地图时出现:APP Referer校验失败。请检查该ak设置的白名单与访问所有的域
    如果是个人内部测试使用,直接将IP白名单设置为*  ......
  • ZPN项目 3:使用 Intel ICX 编译多线程动态运行时pyd的失败记录
    使用Pybind11,可以生成供python调用接口的C++动态链接库,该库包含一个符合python启动签名的函数,并以pyd为后缀。编译生成该库,与生成一般C++库基本一致。特殊地,当采用以下全部配置生成时,程序的调用将失败:使用icx-cl编译器(兼容MSVC编译器标识的icx编译器)使用多线程动态运行时标......
  • 如何统计redis操作失败的次数
    要统计Redis操作失败的次数,你可以使用Redis的监控功能和相关命令。以下是一种可能的方法:开启Redis的监控功能:在Redis的配置文件中,找到redis.conf文件并确保以下行没有被注释掉:#默认禁用,你可以通过以下命令来开启:configsetnotify-keyspace-eventsKEA这将启用键空间通......
  • 如何在外SSH远程连接Ubuntu系统【无公网IP】
    如何在外SSH远程连接Ubuntu系统【无公网IP】文章目录如何在外SSH远程连接Ubuntu系统【无公网IP】前言1.在Ubuntu系统下安装cpolar软件2.完成安装后打开cpolar客户端web—UI界面3.创建隧道取得连接Ubuntu系统公网地址4.打开Windows的命令界面并输入命令前言随着科技和经济的发......
  • Linux记录(根文件系统NFS挂载失败)
    简单说明一下:我们测试跟文件系统的时候不是直接烧写到EMMC里面,这样测试效率太低了,Ubuntu的rootfs目录已经保存了根文件系统,我们只需要在开发板上通过nfs挂载Ubuntu下的rootfs目录即可。也就是说,根文件系统一直在Ubuntu下,开发板通过网络在使用这个根文件系统,这样方......