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

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 正则表达式选项要记得转义》

grep 正则表达式及选项以及注意相关推荐

  1. linux grep正则表达式与grep用法详解

    正则表达式只是字符串的一种描述,只有和支持正则表达式的工具相结合才能进行字符串处理.本文以grep为例来讲解正则表达式. grep命令 功能:输入文件的每一行中查找字符串. 基本用法: grep [- ...

  2. linux查看ip地址特定信息,grep正则表达式实现查找某个特定的IP地址

    下面会举几个在grep命令中使用正则表达式从一个文件中匹配到特定的IP地址.下面的正则表达式将会匹配IPV4的地址. 正则表达式匹配IP地址: 使用下面的正则表达式来匹配IPV4的地址,先来匹配从0. ...

  3. linux邮箱格式正则表达式grep,Linux系统grep正则表达式的介绍

    Linux系统正则表达式是字符串的标示方法, 主要的正则表达式有sed.vim.awk,当然还包括grep正则表达式.前文我们已经介绍了Linux系统正则表达式的用法,今天就来着重介绍一下Linux系 ...

  4. linux grep 正则 id,Linux grep正则表达式

    正则表达式只是字符串的一种描述,只有和支持正则表达式的工具相结合才能进行字符串处理.本文以grep为例来讲解正则表达式. grep一般情况下支持基本正则表达式,可以通过参数-E支持扩展正则表达式,另外 ...

  5. Linux Grep 正则表达式示例

    转载自:Linux Grep 正则表达式示例 grep 是 Linux 中用于文本处理的最有用和功能最强大的命令之一.在本文中,我们将探讨如何在 grep 的 GNU 版本中使用正则表达式的基础,该版 ...

  6. linux中grep命令 菜鸟教程,linux grep正则表达式与grep用法详解

    需要大家牢记:正则表达式与通配符不一样,它们表示的含义并不相同 正则表达式只是字符串的一种描述,只有和支持正则表达式的工具相结合才能进行字符串处理.本文以grep为例来讲解正则表达式. grep命令 ...

  7. linux上查找某个IP,grep正则表达式实现查找某个特定的IP地址

    下面会举几个在grep命令中使用正则表达式从一个文件中匹配到特定的IP地址.下面的正则表达式将会匹配IPV4的地址. 正则表达式匹配IP地址: 使用下面的正则表达式来匹配IPV4的地址,先来匹配从0. ...

  8. Linux - grep -正则表达式

    目录 grep命令 常见选项: -o 选项 --> 只显示匹配的内容 -i 选项 --> 忽略大小写,都匹配显示出来 -n 选项 --> 给匹配的内容加行号 -v 选项: 反转查找, ...

  9. grep 正则表达式

    grep 正则表达式 来源:http://blog.rednet.cn/user1/213546/archives/2007/35795.html 以下为整理的grep 正则表达式的大部分功能,详细参 ...

最新文章

  1. java多线程-sleep()和wait()对比
  2. ​TA们划重点的时候到了:什么是实例工作流?
  3. boostrap 鼠标滚轮滑动图片_16种基于Bootstrap的css3图片hover效果
  4. python exceptions怎么用_Python基础介绍 | Exceptions异常
  5. ubuntu jdk 1.7 安装
  6. python 函数重载_python中有函数重载吗
  7. [导入]VB程序中处理随机事件
  8. luogu P2765 魔术球问题 (最小路径覆盖)
  9. 怎么更改计算机的搜索设置,电脑浏览器默认搜索引擎的设置不了怎么办
  10. [RTOS]--uCOS、FreeRTOS、RTThread、RTX等RTOS的对比之特点
  11. 攻防世界 WEB bilibili
  12. 形式语言与自动机学习心得
  13. vue 百度地图 3d地图
  14. 高通平台关机闹钟设置
  15. slope one predictors
  16. 大数据领域十大必读书籍
  17. 树莓派3B+安装wordpress
  18. uniapp 常用生命周期以及执行顺序
  19. 蒸汽筒行业调研报告 - 市场现状分析与发展前景预测
  20. android微信字体颜色,苹果和安卓微信朋友圈字体颜色如何修改(哪个版本能用啊)...

热门文章

  1. android 封装的popwindow,Android UI开发 popupwindow介绍以及代码实例
  2. append从一个添加到另一_真特么激动第一个爬虫----爬取豆瓣电影top250
  3. JavaScript中,this的绑定规则
  4. 使用Python,OpenCV和Hough圆检测图像中的圆
  5. python采用Basemap绘制完美中国地图(包括绘制边界框,随机点等)
  6. VS2010非永久性配置和永久配置Opencv
  7. 算法了解:RCNN、SPP-Net、Fast-RCNN、Faster-RCNN
  8. android webview 加载本地pdf,android – 在WebView中打开PDF
  9. 两个tplink路由器有线桥接_路由器有线桥接设置方法
  10. 剑指offer:面试题22. 链表中倒数第k个节点