grep和正则表达式

grep即Globally search a Regular Expression and Print,是根据模式对文本进行搜索,并将符合模式的文本行显示出来。

grep用法如下: grep [OPTIONS] PATTERN [FILE…]  其中pattern即为模式,模式是文本字符和正则表达式的元字符组合而成的匹配条件。

grep常用的命令语法:

-i (ignore case)          忽略大小写

–colour   对查找字符加重颜色显示

-v            反向查找,显示未被匹配到的行

-o            只显示被匹配到的字符串,每个字符串显示一行

-n            输出匹配字符串在文件中的行号

-A N         输出匹配字符串的同时显示匹配字符串所有行的前N行

-B N         输出匹配字符串的同时显示匹配字符串所有行的后N行

-C N         输出匹配字符串的同时显示匹配字符串所有行的前N行和后N行

范例:

[root@localhost ~]# grep -n "root" /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 11:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -n --colour "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -o "root" /etc/passwd root root root root 
[root@localhost ~]# grep -i "ROot" /etc/passwd root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

正则表达式: REGular EXPression , REGEXP

    对简单的字符串进行查找匹配时,直接使用字符串查找即可。但是如果对复杂的或者按照某种规律变化的字符串进行匹配时,直接使用字符串匹配可能出现无法匹配或者效率低下的情况。所以此时使用正则表达式来定义一系列的元字符、定位符等组成一个模式进行复杂模式的字符串匹配。

    下面是正则表达式的一些基本元字符:

1、字符匹配:

    

. :匹配任意单个字符
[] :匹配指定范围内的任意单个字符
[^] :匹配指定范围外的任意单个字符
[[:digit:]] :匹配任意单个数字
[[:lower:]] :匹配任意单个小写字母
[[:upper:]] :匹配任意单个大写字母
[[:punct:]] :匹配任意单个标点符号
[[:space:]] :匹配任意单个空白字符
[[:alpha:]] :匹配任意打个英文字母
[[:alnum:]] :匹配任意单个字母或数字

     2、匹配次数:

* : 匹配其前面的字符任意次
\? : 匹配其前面的字符1次或0次
\{m,n\} : 匹配其前面的字符至少m次,至多n次,修饰的是此匹配模式的前面的字符个数

   3、位置锚定:

^ : 锚定行首,此字符后面的任意内容必须出现在行首。
      [root@localhost ~]# grep -n --colour '^r..t' /etc/passwd
      1:root:x:0:0:root:/root:/bin/bash
       以r开头,t结尾的,且必须出现在行首的位置,此时可以看到第一个root是红色的
$ : 锚定行尾,此字符前面的内容必须出现在行尾。
      [root@localhost ~]# grep -n --colour '[[:digit:]]$' /etc/inittab 
      23:#   5 - X11 在/etc/inittab里边以数字结尾的,此时可以看到最后一个1是红色的
^$ : 空白行
      [root@localhost ~]# grep -n '^$' /usr/local/nginx/conf/nginx.conf | wc -l
      此时可以查到31个空白行
\<或者\b : 锚定词首,其后面的任意字符必须做为单词的首部出现
\>或者\b : 锚定词尾,其前面的任意字符必须做为单词的尾部出现
      [root@localhost ~]# grep --colour '\<ro' /etc/passwd root:x:0:0:root:/root:/bin/bash
      operator:x:11:0:operator:/root:/sbin/nologin
      [root@localhost ~]# grep --colour 'ot\>' /etc/passwd
      root:x:0:0:root:/root:/bin/bash
      operator:x:11:0:operator:/root:/sbin/nologin
      [root@localhost ~]# grep --colour '\<root\>' /etc/passwd root:x:0:0:root:/root:/bin/bash
      operator:x:11:0:operator:/root:/sbin/nologin
      此时可以发现红色标注部分就是查询部分

     4、分组

\(\) : 比如\(who\)此处给who看做一个整体进行匹配
此时有一个后向引用原则:
      \(who\)\(her\)[lx]*\1\2
      \1为引用第一个左括号以及与之对应的右括号所包括的所有内容
      \2为引用第二个左括号以及与之对应的右括号所包括的所有内容
      可以以此类推下去\3   \4   \5   .......