grep命令和正则表达式用法

一、grep的使用

1.grep的解释

   grep为Global search Regular Expression and Print out the line的缩写,即根据用户指定的文本搜索模式PATTERN对目标文件进行逐行搜索并显示被模式匹配到的行或者匹配的字符串本身的一种文本搜索工具。

 

2.grep的使用格式

  grep [OPTION]... PATTERN [FILE]...

  其中PATTERN项需要最好使用''或者""扩起来,如果需要对模式进行转换,则需要使用"",如果不需要进行转换,则使用''或""都可以。模式还可以使用正则表达式来表示。

 

3.grep的常用选项

   --color:用来指定被模式匹配到的字符的显示颜色,参数选项有never,always和auto;centos系统默认使用的是grep别名alias grep='grep --color=auto'。

   -v:反向匹配,即不能被模式所匹配到的行,也可以使用--invert-match长选项

   -i:不区分大小写,也可以使用--ignore-case长选项

   -E:支持ERE(扩展的正则表达式),相当于egrep

   -r: 连带文件夹以下目录也查找,即递归查找

   -f, --file=FILE  obtain PATTERN from FILE

   -w, --word-regexp force PATTERN to match only whole words

             wKiom1bj47DAuMaQAABMrqlo9gQ769.png

   -z, --null-data   a data line ends in 0 byte, not newline

   输出控制选项

   -o:只显示被模式匹配到字符串,而非显示整行(grep默认显示被匹配到的整行)

   -A #:与数字'#'一起使用,显示被模式匹配到的行并且显示被匹配到的行的下面#行

   -B #: 与数字'#'一起使用,显示被模式匹配到的行并且显示被匹配到的行的上面#行

   -C #: 与数字'#'一起使用,显示被模式匹配到的行并且显示被匹配到的行的上下各#行

   -q:--quiet, --silient:静默模式,不输出任何信息;注意此参数含义。

[root@localhost ~]# grep -q "root" /etc/passwd > /tmp/a.txt

[root@localhost ~]# 

[root@localhost ~]# cat /tmp/a.txt

[root@localhost ~]# 

[root@localhost ~]# echo $?

0

[root@localhost ~]# 

 

二、正则表达式的使用

1.正则表达式的解释

   正则表达式使用一些字符串来描述、匹配一系列符合某个句法规则的字符串,是由一些ASCII码类字符和一些元字符组成。正则表达式工作在贪婪模式下,尽可能多的去匹配字符。正则表达式从用法上可以分为基本正则表达式BRE和扩展正则表达式ERE

   元字符不表示字符本身的意义,而是用于额外功能性的描述

2.基本正则表达式中元字符的使用

   1)字符匹配

      .:表示匹配任意一个字符,但必须有字符包括空格

        wKiom1bkEd-Qlk8xAAA40Q3z4mA912.png

      []:匹配范围内的任意单个字符;注意括号[ ]中的.不是元字符了;匹配到的空格不会标记颜色。

        wKioL1bkEnrQC_dhAAA1eD-4BD4147.png

      [^]:匹配范围外的任意单个字符。但不完全等同-v选项

        wKiom1bkJsWitZzXAAB6QuxE3nQ755.png

      指定范围的字符还可以使用一些别的元素组成,如

      [[:space:]]:表示空白字符

      [[:lower:]]:表示所有小写字母

      [[:upper:]]:表示所有大写字母

      [[:aplha:]]:表示所有字母,也可使用[a-z]表示

      [[:digit:]]:表示所有的数字,也可以使用[0-9]表示

      [[:almun:]]:表示所有的数字和字母

      [[:punct:]]:表示所有特殊字符

   2)次数匹配:用来指定匹配其前面字符出现的次数,只能匹配次数模式字符紧靠着的一个字符

       .*: 任意长度任意字符

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

      \+:匹配前面的字符1或任意多次

      \?: 出现0次或者1次

      \{m\}: 表示出现m次

      \{m,n\}: 表示至少出现m次,至多出现n次

      \{m,\}:表示至少出现m次

      \{0,n\}:表示至多出现n次,可以出现0次

      wKioL1bkNUnyH2XgAABYU4TloYA808.png  单独的[a-z]是只匹配小写字母的,文件的尾部是空白行,[:space:]和[:blank:]都不会匹配空白行,a\+必须加引号引起来。

      wKiom1bkNRWgEo9PAADn22oIqKY289.png

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

   3)位置锚定符:用于来指定字符出现的位置

       ^:用于锚定行首,用法为^Char

       $:用于锚定行尾,用法为Char$

       ^$:用来表示空白行

    案例:统计/etc/rc.d/rc.sysinit中出现的空白行

     [root@localhost ~]# grep "^$" /etc/rc.d/rc.sysinit |wc -l

     96

     

       单词的锚定:所有非自然的单词

       \<:用于锚定单词的词首,也可以使用\b表示,用法为\<Char或\bChar

       \>:用于锚定单词的行尾,也可以使用\b表示,用法为Char\>或Char\b

   案例:显示/etc/passwd中root的行

    [root@localhost ~]# grep "\<root\>" /etc/passwd

    root:x:0:0:root:/root:/bin/bash

    operator:x:11:0:operator:/root:/sbin/nologin

  4) 分组及引用

     \(PATTERN\):将此PATTERN匹配到的字符当作一个不可侵害整体进行处理;
     
     Note:分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部的变量中,这些变量是\1, \2, \3, ...
      
      pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)
      
      \n:模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;(不是模式,而是模式匹配的结果)

   引用:对分组的字符串基于位置引用

       \1: 后向引用,表示引用前面的第一个左括号与之对应的右括号中的模式所匹配到的内容

       \2: 表示引用前面的第二个左括号与之对应的右括号中的模式所匹配到的内容

      例:此处不适合于英文状态,只是做实例分析

       He like his lover

       She love her liker

       He loves his lover

       She like his liker

      要求:前面显示like的后面显示liker,前面显示love的后面显示lover

      [root@localhost ~]# grep "\(l..e\).*\1r" i.txt

      He loves his lover

      She like his liker

4.扩展正则表达式的使用

    1)字符匹配

      .:表示匹配任意一个字符

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

     [^]:匹配指定范围外的单个字符,也可使使用选项v来完成

     指定范围的字符还可以使用一些别的元素组成,如

      [[:space:]]:表示空白字符

      [[:lower:]]:表示所有小写字母

      [[:upper:]]:表示所有大写字母

      [[:aplha:]]:表示所有字母,也可使用[a-z]表示

      [[:digit:]]:表示所有的数字,也可以使用[0-9]表示

      [[:almun:]]:表示所有的数字和字母

      [[:punct:]]:表示所有特殊字符

   2)次数匹配:用来指定匹配其前面字符出现的次数,只能匹配模式紧靠着的一个字符

       *:出现任意次

      .*: 出现任意次的任意字符

      ?: 出现0次或者1次

      +: 至少出现1次

      {m}: 表示出现m次

      {m,n}: 表示至少出现m次,至多出现n次

      {m,}: 表示最少出现m次

      {0,n}:表示至多出现n次,可以出现0此

   3)位置锚定符:用于来指定字符出现的位置

       ^:用于锚定行首,用法为^Char

       $:用于锚定行尾,用法为Char$

       ^$:用来表示空白行

       单词的锚定:所有非自然的单词

       \<:用于锚定单词的词首,也可以使用\b表示,用法为\<Char或\bChar

       \>:用于锚定单词的行尾,也可以使用\b表示,用法为Char\>或Char\b

   4) 分组和引用和基本正则表达式一样

   5)或者

      a|b:a或者b
      C|cat:表示C或cat
      (C|c)at:表示Cat或cat

     wKiom1bkO33DTbpWAAA5cqFVz3E828.png只有扩展正则表达式有或者|,基本正则表达式没有

三、egrep的使用

   egrep相当于grep -E,使用扩展正则表达式来构建模式,此处不再累赘

练习:

1、显示/proc/meminfo文件中以大小写s开头的行;

# grep "^[sS]" /proc/meminfo

# grep -i "^s" /proc/meminfo

2、取出默认shell为非bash的用户;

# grep -v "bash$" /etc/passwd | cut -d: -f1

3、取出默认shell为bash的且其ID号最大的用户;

# grep "bash$" /etc/passwd | sort -n -t: -k3 | tail -1 | cut -d: -f1

4、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit

5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

# grep "^[[:space:]]\{1,\}[^[:space:]]\{1,\}" /boot/grub/grub.conf

6、找出/etc/passwd文件中一位数或两位数;

# grep --color=auto "\<[0-9]\{1,2\}\>" /etc/passwd

7、查看当前系统上root用户的所有信息;

# grep "^root\>" /etc/passwd

8、添加用户bash和testbash、basher,而后找出当前系统上其用户名和默认shell相同的用户;

# grep --color=auto "^\([[:alnum:]]\{1,\}\)\>.*\1$" /etc/passwd