grep文本查找和正则表达式

一、grep

grep: Global search REgular expression and Print outthe line)全局查找正则表达式并且打印结果行。不会对输入的文本进行修改。

Unix的grep家族包括grep、egrep和fgrep,egrep是grep的扩展,支持更多的正则元字符; fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。

用法:grep [OPTIONS] PATTERN [FILE]

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

常用options:

      –color=auto:对匹配到的行高亮显示。

             在centos6系列中可以以别名的形式将其写入~/,bashrc,以简化命令;centos7默认写入。

      -i(ignorecase):忽略字符的大小写

-o:仅显示匹配到的字符串本身

-v:显示不能被模式匹配到的行

-n:显示满足条件的行的行号

-c:统计满足条件的行数

-e:或者    grep -e root -e bash /etc/passwd

-w: 匹配的模式被当作整个单词

-E:使用扩展到正则表达式元字符;等同于egrep

-F:支持fgrep

-q(–quiet):静默模式,不输出任何信息

-A #:after,显示匹配到的行及其后#行;默认显示后两行

-B #:before,显示匹配到的行及其前#行;默认显示前两行

-C #:context,显示匹配到的行及其前后各#行;默认显示前后两行     

 

egrep:支持扩展的正则表达式,实现类似grep文本过滤功能。等同于grep –E

fgrep:不支持正则表达式,当无需使用到元字符去编写模式时,使用fgrep性能更好。

 

正则表达式(REGEXP):由一类特殊字符及文本字符所编写的模式,用于在查找的过程中匹配指定的字符,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能。

       分两类:

           基本正则表达式: BRE

           扩展正则表达式: ERE

二、基本正则表达式:

1 字符匹配:

. : 匹配任意单个字符;

[] : 匹配指定范围内的任意单个字符

[^] :匹配指定范围外的任意单个字符

[:digit:]:数字

[:lower:] :小写字母

[:upper:] :大写字母

[:alpha:] :所有字母(包含大小写)

[:alnum:] :包含所有字母和数字

[:punct:] :特殊符号

[:space:] :空格

       2 次数匹配:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

             * :匹配前面的字符任意次(0、1或多次)

.* :任意长度的任意字符

\?:匹配其前面的字符0或1次,即其前面的字符是可有可无的

\+:匹配其前面的字符至少1次,即其前面的字符要出现至少1次     

\{n\}:匹配前面的字符n次

\{m,n\}:匹配前面的字符至少m次,至多n次

\{,n\}:匹配前面的字符至多n次

\{n,\}:匹配前面的字符至少n次

       3 位置锚定:

       3.1、行锚定

              ^:行首锚定,用于模式的最左侧

  $:行尾锚定,用于模式的最右侧

      ^PATTERN$: 用于模式匹配整行

^$: 空行

^[[:space:]]*$ :空白行

       3.2、字符锚定

     \< 或 \b:词首锚定,用于单词模式的左侧

     \> 或 \b:词尾锚定;用于单词模式的右侧

     \<PATTERN\>:匹配整个单词

       4分组:

       分组: \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理,如: \(root\)\+

 引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …

 后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身)

\1 :模式从左侧起,第一个坐括号以及与之匹配的右括号之间的模式所匹配的字符

\2 :模式从左侧起,第二个坐括号以及与之匹配的右括号之间的模式所匹配的字符

\3 :模式从左侧起,第三个坐括号以及与之匹配的右括号之间的模式所匹配的字符

……n:模式从左侧起,第n个坐括号以及与之匹配的右括号之间的模式所匹配的字符

实例: \(string1\+\(string2\)*\)

\1: string1\+\(string2\)*

\2: string2

例1:显示/proc/meminfo文件中以大小s开头的行; (要求:使用两种方式)

blob.png

例2:添加用户bash、 testbash、 basher以及nologin(其shell为/sbin/nologin),
而后找出/etc/passwd文件中用户名同shell名的行

blob.png

例3:显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行

blob.png

三、扩展正则表达式

       1、字符匹配:

. :任意单个字符

[] :指定范围的字符

[^] :不在指定范围的字符

       2、次数匹配:注意格式同基本正则表达式的区别

            *:匹配前面字符任意次

? : 0或1次

+: 1次或多次

{m}:匹配m次

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

       3、位置锚定

       3.1、行锚定

            ^ :行首

$ :行尾

       3.2、字符锚定

\<, \b :词首

\>, \b :词尾

       4、分组:注意同基本正则表达式格式上的区别

              ()

后向引用: \1, \2

例: \(xy\)*ab

       5、或

             a|b

 C|cat: C或cat

 (C|c)at:Cat或cat

例1:找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行

blob.png

例2:统计以root身份登录的每个远程主机IP地址的登录次数

blob.png

还有另一种写法,要简单些。不过上一种写法能精确匹配ip地址,也应熟练掌握

blob.png

原创文章,作者:M20-1钟明波,如若转载,请注明出处:http://www.178linux.com/29889

(0)
M20-1钟明波M20-1钟明波
上一篇 2016-08-07 22:07
下一篇 2016-08-07 22:07

相关推荐

  • 帮助和文件管理信息

    history命令: -c 清空命令历史 -d offset 删除历史中指定的第offset个命令 n 显示最近的n条历史 -a 追加本次会话新执行的命令历史列表至历史文件 -n 读历史文件中未读过的行到历史列表 -r 读历史文件附加到历史列表 -w 保存历史列表到指定的历史文件 -p 展开历史参数成多行,但不存在历史列表中 -s 展开历史参数马一行。附加在…

    Linux干货 2017-04-11
  • 逻辑卷管理器 LVM

          逻辑卷管理器 LVM lvm概述   LVM是Logical Volume Manager(逻辑卷管理器)的简写,又译为逻辑卷宗管理器、逻辑扇区管理器、逻辑磁盘管理器。是Linux核心所提供的逻辑卷管理(Logical Volume Management)功能。它在硬盘的硬盘分区之上,又…

    Linux干货 2016-09-02
  • Linux基础(九)-shell编程练习

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash declare -i nologin=0 declare -i login=0 while read l…

    Linux干货 2016-11-20
  • GPG——另一种加密信息的方式

    GPG ·使用gpg实现对称加密 ·对称加密file文件          gpg -c file          ls file.gpg ·在另一台主机上解密file   &n…

    Linux干货 2016-09-22
  • 推荐-tree命令的安装和使用

    一、前言     tree命令是可以把指定文件夹的所以文件用树状罗列出来,呈现目录形式的一个命令。在Centos 6.5中默认不能直接使用: 输入type tree命令(type COMMAND:区别是内建命令还是外部命令)提示不存在: 二、安装       …

    系统运维 2016-03-27
  • 使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

    Linux内核是一名了不起的马戏表演者,它在进程和系统资源间小心地玩着杂耍,并保持系统的正常运转。 同时,内核也很公正:它将资源公平地分配给各个进程。 但是,如果你需要给一个重要进程提高优先级时,该怎么做呢? 或者是,如何降低一个进程的优先级? 又或者,如何限制一组进程所使用的资源呢? 答案是需要由用户来为内核指定进程的优先级 大部分进程启动时的优先级是相同…

    Linux干货 2015-02-14