1、文本处理工具(grep、sed、awk)

grep、egrep、fgrep:文本过滤工具(模式:pattern);

        grep:基本正则表达式,-E,-F;

        egrep:扩展正则表达式,-E,-F

        fgrep:不支持正则表达式,

sed:stream editor,流编辑器;文本编辑器;

awk:linux上的实现为gwak,文本报告生成器(格式化文本);

以上三个工具都会用到正则表达式。


2、正则表达式:(regual expression,REGEXP):由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或统配的功能。

    正则表达式分类:基本正则表达式BRE、扩展正则表达式ERE。(二者的区别:元字符不同)

正则表达式元字符:

grep:全面搜索文件每一行并用模式(过滤条件)匹配,输出匹配行

        模式:由正则表达式的元字符及文本字符所编写出的过滤条件。

正则表达式引擎:(工作于贪婪模式)


grep用法:

 grep [OPTIONS] PATTERN [FILE...]

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

OPTIONS:

--color=auto:对匹配到的文本着色高亮显示;

-i:ignorecase;忽略字符大小写;

-o:只显示匹配到的字符串本身,默认显示是匹配到的行;

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

-E:支持使用扩展的正则表达式;

-q:--quit,--silent;不输出任何东西

-A #:显示匹配到的后#行  after

-B #:显示匹配到的前#行  before

-C #:显示匹配到的前后#行;context


3、基本正则表达式

元字符:(分类:字符匹配:匹配次数、位置锚定、分组及引用)

    字符匹配:

        .:匹配任意单个字符(点号)

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

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

               [ [:digit:]];[[:lower:]];[[:upper:]];[[:alpha:]];[[:alnum:]];[[:punct:]];[[:space:]]

        

 [root@promote ~]# grep r[[:alpha:]][[:alpha:]]t /etc/passwd

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

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

[root@promote ~]#


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

        *:匹配其前面的字符任意次:0,1,多次; 

        .*:匹配任意长度的任意字符;

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

        \+:匹配前面的字符1次或多次;即前面的字符要至少出现1次;

        \{m\}:匹配其前面的字符m次;

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

        \{0,n\}:至多n次;

        \{m,\}:至少m次;

           

[root@promote ~]# grep  ro*t /etc/passwd

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

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

abrt:x:173:173::/etc/abrt:/sbin/nologin

rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin

pkiuser:x:17:17:Certificate System:/usr/share/pki:/sbin/nologin

[root@promote ~]#


    位置锚定:

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

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

        ^PATTERN$:用于PATTERN来匹配整行;

            ^$:空白行;

            ^[[:space:]]*$:空白行或包含空白字符的行;

        

        单词:非特殊字符组成的连续字符(字符串)都称为单词;

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

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

                \<PATTERN\>:匹配完整单词;

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

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

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

[root@promote ~]# grep "\broot" /etc/passwd

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

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

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

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

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

[root@promote ~]#


[root@promote ~]# grep "^root" /etc/passwd

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

[root@promote ~]# grep "root$" /etc/passwd

[root@promote ~]#


    分组及引用:\( \)

            \(xy\)*ab:此处的括号是将前面的xy作为一个分组进行匹配,意思匹配xy0次1次或多次;

      注意:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录在内部变量中,这些变量为:

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

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

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

    后项引用:

        如:grep  \(pattern\).*\1" 文件名:意思是匹配前面的出现的pattern,即相同的内容要出现2次,\1的意思是引用匹配条件。



如:

[root@promote ~]# grep UUID /etc/fstab

UUID=47c2d0d2-2c32-4a36-89e7-420739594a95 /boot                   xfs     defaults        0 0

[root@promote ~]#



4、egrep:扩展正则表达式:等同于与grep -E

      grep [OPTIONS] PATTERN [FILE...]

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

OPTIONS:

-i、-o、-v、-A、-B、-C、-G(基本正则表达式)


扩展正则表达式的元字符:(

元字符分类:字符匹配:匹配次数、位置锚定、分组及引用、或;

    字符匹配:. ; [ ] ;[^ ];

    

    次数匹配:没有转义字符了

       *:匹配其前面的字符任意次:0,1,多次; 

        .*:匹配任意长度的任意字符;

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

        +:匹配前面的字符1次或多次;即前面的字符要至少出现1次;

        {m}:匹配其前面的字符m次;

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

        {0,n}:至多n次;

        {m,}:至少m次;

    

    位置锚定:

        ^:行首锚定

        $:行尾锚定

        \<或\b:词首锚定

        \>或\b:词尾锚定


    分组及引用:

        ( ):分组;括号内的模式匹配到的字符会被记录在正则表达式引擎变量中;

            后项引用:\1;\2


    或:

            a | b :a或者b;

            如:

            C | cat :表示C或cat;

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



5、fgrep:不支持正则表达式元字符:

当无需用到正则表达式元字符过滤时,用fgrep。




6、awk(gawk):报告生成器:从文本文件中抽取符合条件的信息,并以特定格式显示出来;

[root@promote ~]# ls /bin/awk -l            //awk是个链接文件指向gawk;

lrwxrwxrwx. 1 root root 4 Nov 29 20:15 /bin/awk -> gawk

[root@promote ~]#


 格式:

    awk   [OPTION] "SCRIPT" FILE1 FILE2 ......

    AWK [OPTION] "PATTERN {ACTION} " FILE1 FILE2... 

ACTION:

    print:简单打印;

    printf:带打印格式;

OPTION

    -F ‘分隔符’  :指定输入分隔符;


awk常用内置变量之记录变量:

    FS: filed separator;默认是空白字符;读取文本时,所使用字段分隔符;

    RS:record separator ;默认是换行符;读取文本时,输入文本信息所使用的换行符;

    OFS:output filed separator;输出时字段分隔符;

    ORS:output raw separator;输出时行分隔符;

awk常用内置变量之数据变量:    

    NR:the number of input record:awk已经处理了行的行数;

    






#awk 'BEGIN {print "line one\nline two\nline three"}'    //打印第一行、第二行、第三行;

[root@promote ~]# awk -F : '{print $1,$5}' /etc/passwd     //以:为分隔符,输出第一位置和第三位置

root root

bin bin

daemon daemon

[root@promote ~]#






  gawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...

       gawk [ POSIX or GNU style options ] [ -- ] program-text file ...

       pgawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...

       pgawk [ POSIX or GNU style options ] [ -- ] program-text file ...

       dgawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...