当前位置: 首页 > 编程日记 > 正文

grep 正则表达式及选项以及注意

说明:在原文基础上稍作了修改


grep命令简介:

在ex编辑器(我没用过)中,启动ex编辑器后要查找某个字符串时,在ex的命令提示符后键入:

:/pattern/p
:/g/pattern/p

grep这个名字就由来如此。其中p的含义是print,而当g出现在pattern前面的时候,其含义是“文件中所有行”,或“执行全局替换”。

被查找的模式称作正则表达式(regular expression)因此,把pattern换成RE,于是就成了g/RE/p,grep

grep命令语法:

前面的名字由来部分已经明确告诉我们,grep的作用是在一个或多个文件中查找茉个字符模式。egrep和fgrep都只是grep的变体,这里我们不做介绍。看一下grep的语法结构。


#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
    int pfd[2];
    pid_t cpid;
    char buf;
    if(argc != 2)
    {
        fprintf(stderr,"Usage: %s <string>\n",argv[0]);
        exit(0);
    }
    if (pipe(pfd) == -1)
    {
        perror("pipe");
        exit(EXIT_FAILURE);
    }
    cpid = fork();
    if (cpid == -1)
    {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    if (cpid == 0)
    {
        close(pfd[1]);          /* Close unused write end */
        while (read(pfd[0], &buf, 1) > 0)
            write(STDOUT_FILENO, &buf, 1);
        write(STDOUT_FILENO, "\n", 1);
        close(pfd[0]);
        exit(EXIT_SUCCESS);
    }
    else
    {
        close(pfd[0]);          /* Close unused read end */
        write(pfd[1], argv[1], strlen(argv[1]));
        close(pfd[1]);          /* Reader will see EOF */
        wait(NULL);             /* Wait for child */
        exit(EXIT_SUCCESS);
    }
}
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
    int pfd[2];
    pid_t cpid;
    char buf;
    if(argc != 2)
    {
        fprintf(stderr,"Usage: %s <string>\n",argv[0]);
        exit(0);
    }
    if (pipe(pfd) == -1)
    {
        perror("pipe");
        exit(EXIT_FAILURE);
    }
    cpid = fork();
    if (cpid == -1)
    {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    if (cpid == 0)
    {
        close(pfd[1]);          /* Close unused write end */
        while (read(pfd[0], &buf, 1) > 0)
            write(STDOUT_FILENO, &buf, 1);
        write(STDOUT_FILENO, "\n", 1);
        close(pfd[0]);
        exit(EXIT_SUCCESS);
    }
    else
    {
        close(pfd[0]);          /* Close unused read end */
        write(pfd[1], argv[1], strlen(argv[1]));
        close(pfd[1]);          /* Reader will see EOF */
        wait(NULL);             /* Wait for child */
        exit(EXIT_SUCCESS);
    }
}

grep使用的正则表达式元字符:

正则表达式中的元字符,我之前在javascript的日志中详细介绍过。这里不再解释何为正则表达式,只让大家来看一下在grep中使用的正则表达式元字符。

元字符功能示例匹配对象
^行首定位符‘^simaopig%’匹配所有以simaopig开头的行
$行尾定位符‘simaopig$’匹配所有以simaopig结尾的行
.匹配任意一个字符‘s.m’匹配包含一个s字符,后面跟一个字符(随意),再跟一个m的行
*匹配0或多个前一字符‘s*m’匹配包含零个或多个s字符,后面跟有一个m字符的行
[]匹配一组字符中的任意一个‘[Ss]imaopig’匹配simaopig,或者Simaopig
[^]匹配不在指定字符组内的字符‘[^a-z]imaopig’匹配不包含在a-z之间的字符后跟着imaopig的行,即所有aimaopig-zimaopig的行都不包含(有点绕)
\<词首定位符‘\<simaopig’匹配以simaopig为开头的词的行,simaopigabcd也是可以的
\>词尾定位符‘simaopig\>’匹配以simaopig为结尾的词的行,abcdsimaopig也是可以的
\(..\)标记匹配的字符‘\(simaopig\)'s blog’标记寄存器里的一段字符,该寄存器被记作1号寄存器。以后引用这段字符时,可以使用\1来重复该模式。9个标签中最左边的是第一号。例如,模式simaopig被保存在1号寄存器里,之后用\1来引用它。
x\{m\}或x\{m,\}或x\{m,n\}字符x的重复出现‘s\{5\}’,'s\{5,\}’,'s\{5,10\}’匹配连续出现5个s、至少5个s或5到10个s的行

grep的选项:

观其语法结构,grep有着很丰富的选项。下面的表格中我会为大家介绍其常用的选项。

选项功能
-b在每一行前面加上其所在的块号,根据上下文定位磁盘块时可能会用到
-c显示匹配到的行的数目,而不是显示行的内容
-h不显示文件名
-i比较字符时忽略大小写的区别
-l(小写的字母L)只列出匹配行所在文件的文件名(每个文件名只列一次),文件名之间用换行符分隔
-n在每一行前面加上它在文件中的相对行号
-s无声操作,即只显示报错信息,用于检查退出状态
-v反向查找,只显示不匹配的行
-w把表达式作为词来查找,就好像它被\<和\>夹着那样。只适用于grep(并非所有版本的grep都支持这一功能,譬如,SCO UNIX就不支持)

grep简单示例:

例如第一个表格中,我想查找所有带有if的行并且显示行号,如何查找呢?

grep -n if a.html

输出:


使用过程中,使用最多的参数就是 -v ,但是用着并不爽。

比如说,我想查找一个单词“UserService”,但是像”*.svn” 这种文件就不用显示了,我该怎么做呢?

grep -r "UserService" ./ | grep -v "svn"

但是,如果类似于含有”test、auto_load”之类的文件我也不显示,怎么做呢?我之前的做法是:

grep -r "UserService" ./ | grep -v "svn" | grep -v "test" | grep -v "auto_load"

命令很长,而且麻烦,于是就想,grep本身是按照正则表达式来当做选项的,那么我是不是可以利用到正则表达式的“或|”命令?

grep -r "UserService" ./ | grep -v "svn|test|auto_load"

很显示,执行结果显示上面的命令不符合我的需求,于是苦思不得其解。原来,在使用正则表达式选项时,要记得将”|”转义。最终命令如下:

grep -r "UserService" ./ | grep -v "svn\|prj\|test\|auto_load"

声明: 本文采用 BY-NC-SA 协议进行授权 | 小小子
转载转自《grep 正则表达式及选项》和《grep 正则表达式选项要记得转义》

相关文章:

iOS_25彩票_幸运转盘

终于效果图: 各个view的关系图: 背景圆盘(须要扣图处理)LuckyBaseBackground.png 盖在背景圆盘上面的转盘 LuckyRotateWheel.png 代表一个星座或生肖的button背景图片 要创建12个,并以最下方中点为锚点进行旋转 对背景圆盘进行扣图,并在其上面盖上转盘图片的核心代码 在自己定义…

Python 自动化办公之 Excel 对比工具

作者 | 周萝卜来源丨萝卜大杂烩今天我们继续分享真实的自动化办公案例&#xff0c;希望各位 Python 爱好者能够从中得到些许启发&#xff0c;在自己的工作生活中更多的应用 Python&#xff0c;使得工作事半功倍&#xff01;需求由于工作当中经常需要对比前后两个 Excel 文件&am…

jQuery简单实现iframe的高度根据页面内容自适应的方法(转)

本文实例讲述了jQuery简单实现iframe的高度根据页面内容自适应的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;方式1&#xff1a;//注意&#xff1a;下面的代码是放在和iframe同一个页面中调用 $("#iframeId").load(function () {var mainheight $(t…

linux wc 命令简介

此wc命令不是让大家没有食欲的地方。而是linux下一个简单的小命令。NAMEwc — word, line, character, and byte countSYNOPSISwc [-clmw] [file ...]下面让我们来简单的看一下其支持的参数及其代表的含义。 参数及含义 参数含义-c显示文件的Bytes数(字节数)-l将每个文件的行数…

这个插件竟打通了Python和Excel,还能自动生成代码!

作者 | 云朵君来源丨数据STUDIO加载一个Jupyter插件后&#xff0c;无需写代码就能做数据分析&#xff0c;还帮你生成相应代码&#xff1f;没错&#xff0c;只需要加载这个名为Mito的小工具包&#xff0c;用Python做数据分析&#xff0c;变得和用Excel一样简单&#xff1a;介绍以…

集合list set Map问题

2019独角兽企业重金招聘Python工程师标准>>> ####集合list set Map的个人理解 首先集合说的对一类数据的存储容器&#xff0c;对象都是引用类型并不是基本数据类型 collection 接口 list和set都需实现它 collections 抽象了一些集合的基本功能&#xff0c;reverse s…

python学习第四课

#!/user/bin/env python#-*-coding:utf-8-*-# 一、字符串魔法# &#xff08;1&#xff09;.isalpha()是否是字母或汉字。# 例&#xff1a;# a"张san22"# b"张三lisi"# va.isalpha()# v1b.isalpha()# print(v)# print(v1)# 因为a里含有数字&#xff0c;结果…

PHP 截取字符串专题

1. 截取GB2312中文字符串<?php< ?php//截取中文字符串functionmysubstr($str, $start, $len){$tmpstr ""; $strlen $start $len; for($i 0; $i< $strlen; $i){if(ord(substr($str, $i, 1))> 0xa0){$tmpstr. substr($str, $i, 2); $i; }else$tm…

​GPT-3好“搭档”:这种方法缓解模型退化,让输出更自然

作者 | LZM来源丨数据实战派文本生成对于许多自然语言处理应用来说都是非常重要的。但神经语言模型的基于最大化的解码方法&#xff08;如 beam search&#xff09;往往导致退化解&#xff0c;即生成的文本是不自然的&#xff0c;并且常常包含不必要的重复。现有的方法通过采样…

(Question)CSS中position的绝对定位问题

RT,绝对定位相对于定位的元素存在是哪里&#xff1f; https://yunpan.cn/crjSMTiak2srZ 访问密码 1570转载于:https://www.cnblogs.com/LiuChunfu/p/5139958.html

BZOJ 4817: [Sdoi2017]树点涂色(LCT+树剖+线段树)

题目描述 Bob有一棵 nn 个点的有根树&#xff0c;其中1号点是根节点。Bob在每个点上涂了颜色&#xff0c;并且每个点上的颜色不同。 定义一条路径的权值是&#xff1a;这条路径上的点&#xff08;包括起点和终点&#xff09;共有多少种不同的颜色。 Bob可能会进行这几种操作&am…

ls -l |wc -l命令多统计一行

#ls -l |wc -l注意&#xff1a;总用量也占用1行&#xff0c;所以统计出来的是14而不是13其他网友提醒 #ls -l |wc -l 就统计实际的行&#xff0c;放大就看出效果1和l不同

驱动数字经济加速,摩尔线程发布全新元计算架构MUSA和GPU产品

2022年3月30日&#xff0c;北京——摩尔线程今天举行主题为“元动力 创无限”的春季发布会。摩尔线程创始人兼CEO张建中解读了“元计算”这一产业趋势&#xff0c;并发布全新架构及系列重磅新品&#xff0c;包括&#xff1a;MUSA&#xff08;Moore Threads Unified System Arch…

HDU 4869 Turn the pokers(思维+组合公式+高速幂)

Turn the pokers 大意&#xff1a;给出n次操作&#xff0c;给出m个扑克。然后给出n个操作的个数a[i]&#xff0c;每一个a[i]代表能够翻的扑克的个数&#xff0c;求最后可能出现的扑克的组合情况。Hint Sample Input&#xff1a; 3 3 3 2 3 For the this example: 0 express fac…

马云打响本地生活消费攻坚战,饿了么获手淘一级入口,美团危险了

8月2日&#xff0c;细心的网友可以发现&#xff0c;手机淘宝App首页已上线“饿了么外卖”&#xff0c;饿了么成为手机淘宝首页的10个默认入口之一。这也就意味着以后手机淘宝用户可以通过淘宝首页新入口进入外卖服务&#xff0c;在应用内直接完成由饿了么提供的订餐外卖服务。 …

Linux文件,文件描述符以及dup()和dup2()

一.Linux中文件 可以分为4种&#xff1a;普通文件、目录文件、链接文件和设备文件。1、普通文件是用户日常使用最多的文件&#xff0c;包括文本文件、shell脚本、二进制的可执行和各种类型的数据。ls -lh 来查看某个文件的属性&#xff0c;可以看到有类似 -rw-r--r-- &#xff…

摩尔线程推出首款数据中心级全栈功能GPU:MTT S2000

2022年3月30日&#xff0c;北京——摩尔线程正式推出首款基于其先进架构MUSA统一系统架构&#xff08;Moore Threads Unified System Architecture&#xff09;打造的数据中心级多功能GPU产品MTT S2000。摩尔线程MTT S2000基于其第一代MUSA架构GPU芯片苏堤研发制成&#xff0c;…

jquery 获取 outerHtml 包含当前节点本身的代码

在开发过程中&#xff0c;jQuery.html() 是获取当前节点下的html代码&#xff0c;并不包含当前节点本身的代码&#xff0c;然后我们有时候确需要&#xff0c;找遍jQuery api文档也没有任何方法可以拿到。 看到有的人通过parent().html()&#xff0c;如果当前元素没有兄弟元素还…

修改CentOS yum源

解决在CentOS yum源下载慢的办法最近在虚拟机下面安装了个CentOS 5.5&#xff0c;使用yum更新时发现下载速度异常慢。可以修改yum的配置文件&#xff0c;把其镜像指向国内的服务器即可。 方案一&#xff1a; # cd /etc/yum.repos.d/ # mv CentOS-Base.repo CentOS-Base.repo.b…

带monkey的测流量!

为什么80%的码农都做不了架构师&#xff1f;>>> //public static void flow(){ //String command1 "adb shell monkey -p com.netease.newsreader.activity -s 500 -v 2000"; //String command2 "adb shell ps"; //String str"com.nete…

实现AI技术自立自强,国产深度学习框架面临三大难题

作为推动AI应用大规模落地的关键力量&#xff0c;深度学习框架的重要性日益凸显。它不仅关系国计民生的行业和领域广泛的应用&#xff0c;同样也对信息系统的科技安全有着决定性的意义。 “深度学习框架在人工智能技术体系中&#xff0c;处于贯通上下的腰部位置&#xff0c;它下…

关于Android H5混合开发遇到的问题

2019独角兽企业重金招聘Python工程师标准>>> 添加WebChromeClient&#xff0c;复写onJsAlert、onJsConfirm、onJsPrompt方法后&#xff0c;弹框异常退出问题 项目经理说&#xff0c;Android没有处理弹框&#xff0c;点击按钮没有反应&#xff0c;iOS就可以。于是就复…

手动配置lnmp环境

做php开发的&#xff0c;想要进一步提升自己&#xff0c;手动搭建开发环境&#xff0c;我想是必须经历的一个坎。虽然说有很多第三方集成环境可供使用&#xff0c;但我想说的是在你没有自己搭建过一次环境的时候&#xff0c;你没有太多的资本去“偷懒”。虽然我自己也是个菜鸟&…

负载均衡,会话保持,session同步

一&#xff0c;什么负载均衡一个新网站是不要做负载均衡的&#xff0c;因为访问量不大&#xff0c;流量也不大&#xff0c;所以没有必要搞这些东西。但是随着网站访问量和流量的快速增长&#xff0c;单台服务器受自身硬件条件的限制&#xff0c;很难承受这么大的访问量。在这种…

终于“打造”出了一个可以随时随地编程的工具

作者 | 老表来源丨简说Python分享概要 系统&#xff1a;阿里云ECS共享型n4服务器 1核2g 存储50g&#xff08;双十一便宜买的&#xff0c;180元/3年&#xff09;环境&#xff1a;自带python3.6.8 方便演示&#xff0c;直接使用它开始动手动脑 首先我们需要连接上服务器&#xff…

JVM堆 栈 方法区详解

一、栈 每当启用一个线程时&#xff0c;JVM就为他分配一个JAVA栈&#xff0c;栈是以帧为单位保存当前线程的运行状态 栈是由栈帧组成&#xff0c;每当线程调用一个java方法时&#xff0c;JVM就会在该线程对应的栈中压入一个帧 只有在调用一个方法时&#xff0c;才为当前栈分配一…

ECSHOP学习笔记

帮助 http://help.ecshop.com/index.phpECSHOP各文件夹功能说明 1、根目录&#xff1a;前台程序文件2、admin&#xff1a;后台程序文件夹 --根目录&#xff1a;后台程序文件 *.php文件 --help\zh_cn&#xff1a;各功能的帮助文件 *.xml文件 --images&#xff1a;后台页面…

Redis主从复制配置

环境描述Redis Master&#xff1a;192.168.1.100 6379(Ubuntu系统)Redis Slave1&#xff1a;192.168.1.101 6380(Ubuntu系统)Redis Slave2&#xff1a;192.168.1.102 6381(Ubuntu系统) 安装redis分别在192.168.1.100、192.168.1.101、192.168.1.102三台机器上安装redis&#xf…

利用 Python 打造一个语音合成系统

作者 | thedaydreamer来源丨CSDN博客背景一直对语音合成系统比较感兴趣&#xff0c;总想能给自己合成一点内容&#xff0c;比如说合成小说&#xff0c;把我下载的电子书播报给我听等等。语音合成系统其实就是一个基于语音合成的工具&#xff0c;但是这个东西由于很多厂家都提供…

干货:排名前 16 的 Java 工具类!

2019独角兽企业重金招聘Python工程师标准>>> 干货&#xff1a;排名前 16 的 Java 工具类&#xff01; 在Java中&#xff0c;工具类定义了一组公共方法&#xff0c;这篇文章将介绍Java中使用最频繁及最通用的Java工具类。以下工具类、方法按使用流行度排名&#xf…