grep、egrep、fgrep命令和正则表达式用法

一、简介

 1.1、grep说明

   grep命令简单来说就是linux系统实现文本内容筛选过滤的命令。当我们需要快速定位查找文本(通常是配置文件)中我们需要的内容时,使用grep命令绝对算是最有效的处理方式之一。原因就在于grep可以配合包括“管道”、“正则表达式”等命令完成我们想要的关键字筛选过滤功能。个人认为不管是喜欢Linux系统的发烧友,还是DBA、程序员、运维人员、架构师、项目经理等,熟练运用掌握grep命令都是必不可少的。比如在日常工作中令开发人员很头大的事情就是在查看tomcat中项目运行生成的日志文件,这些日志文件通常内容都非常之多,而快速定位到日志里面的异常错误提示信息是必不可少的,这种情况下其中一种解决方案就是采用grep命令来定位查找输出关键信息(当然还有更多其他不错的解决方案)。

 1.2、正则表达式说明

   正则表达式(英文:Regular Expression)简单来说就是一种按特定要求定义的符合某种语法规则语义的字符串。采用正则表达式可以帮助我们实现过滤、筛选等常见功能。例如它可以轻松完成校验电话、邮箱格式是否正确、url拦截匹配等常用功能,减少了一系列不必要的条件判断,从而提升工作效率。从实用性角度来说,不管是在linux系统中配合grep命令实现关键字查找匹配,还是数据库编写sql语句,甚至服务端及前端校验数据安全性等方面都离不开正则表达式,它几乎可以说是IT从业人士必须要理解掌握的关键技术。

二、用法

   首先grep是bash中非常好用的命令,虽然不是系统内置命令,不过一般的linux系统安装完成之后都会自带这个命令。grep命令常见用法有三种,分别是grepegrepfgrep。下面分别介绍如下三种。

  2.1、grep 使用格式如下(关键参数标红):

  grep [OPTIONS] PATTERN [FILE…]

  grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

  例1:实现在passwd文件中搜索root用户并把搜索结构显示出来的关键字标红,命令如下:

  grep –color=auto "root" /etc/passwd

  效果如下图:

  a.png

  例2:只显示匹配到的关键字,不显示其他内容,命令如下:

  grep –color=auto -o "root" /etc/passwd

  效果如下图:

  a.png

  例3:如果想一直显示关键字标红功能,可以定义别名,保证长期有效,如当前root用户永久生效此配置,

  设置方式如下图:

  a.png

  例4:搜索结果出现的关键字忽略字母大小写,命令如下:

  grep -i "root" /etc/passwd

  效果如下图:

  a.png

  例5:实现搜索结果取反操作(显示为非匹配的搜索结果),命令如下:

  grep -v "abc" test.txt

  效果如下图:

  a.png

 例6:搜索结果显示行号,命令如下:

 grep -n "ab" text.txt

 效果如下图:

 a.png

 例7:查找出匹配的搜索结果前n行、后n行或前后n行,命令如下:

 grep -A 2 "AbC" text.txt

 grep -B 2 "AbC" text.txt

 grep -C 2 "AbC" text.txt

grep、egrep、fgrep命令和正则表达式用法 效果如下图:

 a.png

 例8:grep命令不仅可以查找文本匹配内容,文件夹和文件也能通过grep配合管道实现查找,命令如下:

   a.png

 2.2、grep配合正则表达式

 2.2.1、字符匹配

 例1:(正则表达式.) 搜索匹配任意单个字符,命令如下:

 grep "a.c" test.txt

 效果如下图:

 a.png

 例2:(正则表达式[])搜索指定范围匹配的任意单个字符,命令如下:

 grep "[ad]" test.txt

 效果如下图:

 a.png

 

 例3:(正则表达式[^])搜索指定范围匹配的任意单个字符,命令如下:

 grep "[^ad]" test.txt

 效果如下图:

 a.png

 

 例4:(正则表达式[0-9]或[[:digit:]])搜索指定数字范围内匹配到的结果,命令如下:

 grep "[0-9]" test.txt 或 grep "[[:digit:]]" test.txt

 效果如下图:

 a.png

 例5:(正则表达式[a-z]或[[:lower:]])搜索指定小写字母范围内匹配到的结果,命令如下:

 grep "[a-z]" test.txt 或 grep "[[:lower:]]" test.txt

 效果如下图:

 a.png

 例6:(正则表达式[A-Z]或[[:upper:]])搜索指定写字母范围内匹配到的结果,命令如下:

 grep "[A-Z]" test.txt 或 grep "[[:upper:]]" test.txt

 效果如下图:

grep、egrep、fgrep命令和正则表达式用法 a.png

 例7:(正则表达式[[:space:]])搜索匹配单行包含空格的内容,命令如下:

 grep "[[:space:]]" test.txt

 效果如下图:

 a.png

 例8:(正则表达式[[:punct:]])搜索匹配单行包含标点符号的内容,命令如下:

 grep "[[:punct:]]" test.txt

 效果如下图:

 a.png

 例9:(正则表达式[[0-9a-z-A-Z]]或[[:alnum:]])搜索匹配单行包含数字和大小写字母的内容,命令如下:

 grep "[[0-9a-zA-Z]]" test.txt  或 grep "[[:alnum:]]" test.txt 

 效果如下图:

 a.png

 a.png

 例10:(正则表达式[[a-z-A-Z]]或[[:alpha:]])搜索匹配单行包含大小写字母的内容,命令如下:

 grep "[[a-zA-Z]]" test.txt 或 grep "[[:alpha:]]" test.txt

 效果如下图:

 a.png

 2.2.2、次数匹配

 例1:(正则表达式*)搜索匹配单行*左侧的任意长度的字符,包含0次1次或多次,命令如下:

 grep "a*" test.txt

 效果如下图:

 a.png

 例2:(正则表达式.*)搜索匹配单行任意长度的任意字符,包含0次1次或多次,属于贪婪模式,命令如下:

 grep "a.*" test.txt

 效果如下图:

 a.png

 例3:(正则表达式\?)搜索匹配单行\?左侧字符出现0次或1次,命令如下:

 grep "d\?" test.txt

 效果如下图:

 a.png

 例4:(正则表达式\+)搜索匹配单行\+左侧字符至少出现1次,命令如下:

 grep "a\+" test.txt

 效果如下图:

 a.png

 例5:(正则表达式\{m\})搜索匹配单行\{m\}左侧字符精确出现m次,命令如下:

 grep "a\{2\}" test.txt

 效果如下图:

 a.png

 例6:(正则表达式\{m,n\})搜索匹配单行\{m,n\}左侧字符至少出现m次,至多出现n次,命令如下:

 grep "a\{1,2\}" test.txt

 效果如下图:

 a.png

 例7:(正则表达式\{0,n\})搜索匹配单行\{0,n\}左侧字符最多出现n次,命令如下:

 grep "a\{0,2\}" test.txt

 效果如下图:

 a.png

 例8:(正则表达式\{m,\})搜索匹配单行\{m,\}左侧字符至少出现m次,命令如下:

 grep "a\{m,\}" test.txt

 效果如下图:

 a.png

 2.2.3、位置锚定

 例1:(正则表达式^)搜索匹配单行锚定行首内容,命令如下:

 grep "^a" test.txt

 效果如下图:

 a.png

 例2:(正则表达式$)搜索匹配单行锚定行尾内容,命令如下:

 grep "c$" test.txt

 效果如下图:

 a.png

 例3:(正则表达式^$)搜索匹配空白行内容,命令如下:

 grep "^$" test.txt

 效果如下图:

 a.png

 例4:单词锚定:

 (正则表达式\<)实现锚定词首,也可以用\b实现同样效果

 (正则表达式\>)实现锚定词尾,也可以用\b实现同样效果

 命令如下:

 grep "\<12" test.txt 或 grep "\b12" test.txt

 grep "test\>" test.txt 或 grep "test\b" test.txt

 效果如下图:

 a.png

 整个单词锚定:

 (正则表达式\<…\>)实现锚定整个词,也可以用\b实现同样效果

 命令如下:

 grep "\<456test\>" test.txt 或 grep "\b456test\b" test.txt

 效果如下图:

 a.png

 例5:分组锚定:

 (正则表达式\(\))实现分组锚定,分组匹配到的结果字符,自动被grep记忆在内置变量中,这些变量分别是\1、\2 …并且这些变量可以再次被使用。

 \1: 引用,在该模式中自左而右,获取由第一个左括号以及与之对应的右括号中的模式所匹配到的内容。

 \2: 引用,在该模式中自左而右,获取由第二个左括号以及与之对应的右括号中的模式所匹配到的内容。

 命令如下:

 grep "\(123\)" test.txt

 grep "\(123\).*\1" test.txt

 grep "\(456\)….\1\(789\)\2" test.txt

 效果如下图:

 a.png

  2.2.4、egrep 使用说明

  egrep使用格式与grep基本相同(可使用grep -E command实现同样效果),不过egrep只支持扩展的正则表达式,不支持基本正则表达式。

     命令:egrep PATTERN FILE… 或 grep -E PATTERN FILE…

     egrep支持如下用法:

     字符匹配模式如下:

        .

        []

        [^]

     次数匹配模式如下:

        *: 任意次

        ?:0或1次

        +: 至少1次

       {m}:精确匹配m次;

       {m,n}:至少m次,至多n次;

       {m,}:至少m次;

       {0,n}:至多次;

     位置锚定模式如下:

        ^

        $

        \<, \b

        \>, \b

     分组匹配模式如下:

       ()

       引用:\1, \2, …

     或者匹配支持如下:

       a|b:a或b  或两侧的所有内容;

 

 egrep或者匹配示例:

 (正则表达式|)实现或者匹配,命令如下:

 egrep "456|789" test.txt 或 grep -E "456|789" test.txt

 效果如下图:

 a.png

 2.2.5、fgrep 使用说明

 fgrep不支持正则表达式,只能实现全部关键字匹配,个人感觉实际工作中不太常用。

 fgrep示例:

 fgrep "abdc" test.txt

 效果如下图:

 a.png

三.结尾总结

   grep以及相关正则表达式是linux系统中日常工作开发必须掌握的命令。egrep实现功能基本与grep相同,只是写法稍有不同,可根据个人习惯选择采用grep或egrep命令。fgrep因为不支持正则表达式,因此很少使用。



原创文章,作者:镜花水月,如若转载,请注明出处:http://www.178linux.com/7040

(1)
镜花水月镜花水月
上一篇 2015-08-31 09:57
下一篇 2015-08-31 10:42

相关推荐

  • Linux基础 & bash基础特性

    Q1:描述计算机的组成及其功能。 计算机的组成:运算器、控制器、存储设备、输入设备、输出设备。 运算器: 运算器是计算机中执行各种算术和逻辑运算操作的部件。运算器的基本操作包括加、减、乘、除四则运算,与、或、非、异或等逻辑操作,以及移位、比较和传送等操作,亦称算术逻辑部件。 存储设备: 计算机总是需要记录与读取数据的,而这些数据当然不可能每次都由用户经过键盘…

    Linux干货 2016-10-30
  • Linux 2.6.39-rc3的一个插曲

    2011年4月12日,Linux 2.6.39-rc3发布了,Linus Torvalds写了一个发布邮件,其中包含了一个长长的为这个版本做过贡献的人员名单,这个名单中有很多看上去应该是中国人的名字,我挺为他们感到骄傲的(不知道你是否还记得以前本站的”Linux是由谁写的“)。 不过,没过一会,发现了一个bug,经过大家的调查(2.6.38版没有发现这个问题…

    Linux干货 2016-06-09
  • shell脚本的一点补充

    脚本内容补充 数组 变量:存储单个元素的内存空间数组:存储多个元素的连续的内存空间,相当于多个变量的集合。 数组名和索引 索引:编号从0开始,属于数值索引注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开始支持。bash的数组支持稀疏格式(索引不连续) 数组的使用 声明数组: declare -a ARRAY_NAME…

    Linux干货 2016-08-24
  • sed 高级编辑命令、模式空间、保持空间、vi 可视化模式、vimrc、地址定界

    sed 高级编辑命令、模式空间、保持空间、vi 可视化模式、vimrc、地址定界 sed(stream deitor):行编辑器 【概述】sed是一种流式编辑器,它一次处理一行内容。处理时,把当前处理的行的所有内容存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,逐行处理,不修改文件。sed主要…

    Linux干货 2016-08-11
  • DNS从入门到管理(一)

    DNS从入门到管理(一) DNS概念 DNS三步法 反向解析 主从DNS服务器的实现 子域授权 智能DNS 压力测试与DNS排错 DNS概述 DNS(Domain NameSystem,域名系统),域名和IP地址相互映射的一个分布式数据库,通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析。而DNS的主要作用,就是域名解析,将主机名解析成IP地址。…

    Linux干货 2016-10-06
  • bash脚本编程语言if语句,find文件查找和压缩工具及课后作业练习

    一.概述 使用read命令来接受输入 使用read来把输入值分配给一个或多个shell变量: -p指定要显示的提示 -t TIMEOUT read从标准输入中读取值,给每个单词分配一个变量 所有剩余单词都被分配给最后一个变量 read -p “Enter a filename:“ FILE 过程式编程语言: 顺序执行 选择执行 循环执行 条件选择if语句 选…

    Linux干货 2016-08-22