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