一、概念

   正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

   给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

   1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);

   2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。

正则表达式的特点是:

   1. 灵活性、逻辑性和功能性非常的强;

   2. 可以迅速地用极简单的方式达到字符串的复杂控制。

   3. 对于刚接触的人来说,比较晦涩难懂。

二、分类

  1. grep 基本正则表达式

  2. egrep 扩展正则表达式

  3. fgrep 不支持正则表达式元字符,搜索字符串的速度快;

三、基本正则表达式grep

基本正则表达式grep: Galobal search Reagular Expression and Printing

1、命令格式

grep [options](选项) "pattern"(模式) /path/to/file (文件)

2、命令选项

-i查找内容时忽略大小写(Ignore Case)
-v反转查找(in Vert)
--color=auto:结果匹配内容带颜色显示,默认为红色
    export GREP_COLOR='01;36' 颜色可自己更改
-v:反向选取,只显示不符合模式的行;
-o:只显示配模式匹配的字符串,而不是整个行;
-i:不区分字符大小写
-A #:显示匹配到行时,顺带显示其后面的#个行;
-B #:前面的#行;
-C #:前后的#行;
-E:调用扩展正则表达式;
    grep -E =egrep

3、元字符

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

^:锚定行首的符合条件的内容,用法格式"^pattern";
$:锚定行尾的符合条件的内容,用法格式"pattern$";
    ^pattern$
    ^$:空白行
        grep "^$" /etc/rc.d/rc.sysinit |wc -l  查找空白行并统计行数
.:匹配任意单个字符;
*:匹配紧挨在其前面的字符的字符任意次;
    a*b,ab,aab,acb,b
    .*:匹配任意长度的任意字符
        grep "r.*h" /etc/passwd
        grep "^r.*$" /etc/passwd
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
            [a-z],[A-Z],[0-9]
            [:lower:] a-z
            [:upper:] A-Z
            [:digit:] 0-9
            [:alpha:] a-z,A-Z
            [:alnum:] a-z,A-Z,0-9
            [:space:] 空白字符
            [:pundt:] 标点符号
            grep "r[0-9].*h" /etc/passwd
\?:匹配紧挨在其前面的字符0次或1次;
    a\?b:ab,acb,aab,b
    ^a\?b$:
\{m,n}:匹配其前面的字符至少m次,至多n次
    \{0,n}:至多n次,0-n次;
    \{m,\}:至少m次
    \{m,\}:精确匹配m次
        a\{1,3}b:
        grep "[bB].\{2,5\}[tT]":Boot,B123T,bsd12T
\< 锚定词首,用法格式:\<pattern
    \b: \bpattern
\> 锚定词尾,用法格式:pattern\>
    \b: pattern\b
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
\(\):分组,用法格式
    \(ab\)\{1,3\}: ab,aab,abb,abab,ababab
\(a.b\).*\1:前匹配后引用

四、扩展正则表达式egrep=grep -E

.:任意单个字符
[]:指定范围内的单个字符
[^]:指定范围外的单个字符
*:其前面的字符任意次
+:匹配其前面的字符至少1次
?:匹配0次到1次
{m,n}
():分组,支持引用\1,\2;
a|b:a或者b;二选一
    grep "(c|C)at" /etc/test.txt
\<:锚定词首
\>:锚定词尾
^:行首锚定
$:行尾锚定

五、应用实例:

1、显示/etc/passwd以ro开头的行;

145216695.gif

2、显示/etc/passwd,以nologin结尾的行

152255202.gif

3、显示/etc/passwd,以r开头以h结尾的行

155736812.gif

显示/etc/rc.d/rc.sysinit文件中的空白行并统计行数

160121453.gif

4、取出默认shell为bash,且其用户ID号最小的用户的用户名

164807149.gif

5、显示/etc/rc.d/rc.sysinit中符合形为“任意单个字符n任意字符任意单个字符n”模式的行;即任意单个字符后面跟了个n,n后面有任意长度的任意字符,而后是任意单个字符后面跟了个n,但后面的n之前的字符要与前面的n之前的字符相同

165600375.gif

6、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行

173510287.gif

7、显示/var/log/secure.1文件中记录的属于当前系统时间的前一天的信息中包含“Failed password”或“FAILED LOGIN”的行;而后统计相关的行数

173731674.gif


8、匹配IP地址有两种方式

180000888.gif


[root@lyd ~]# ifconfig | grep -o -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>"
172.16.251.65
127.0.0.1

180122883.gif