Linux 文本处理之grep

      我们经常会遇到只需要一个文件里的只言片语,比如从文件里获取一串字符或者样式,可以用cat +文件一个一个找,这样不仅效率低,而且海量的字符会让你奔溃的。这个时候需要了解一下文本处理三剑客,分别是 grep 文本过滤工具 ;sed 文本编辑工具 ;awk 文本报告生成器。

    1.grep 

            英文全拼:Global search REgular expression and Print out the line(全面搜索正则表达式并把行打印出来)grep是每个Linux发行版都预装的文件工具。

    2.作用

            强有力的文件模式搜索工具,根据用户指定的"模式"(由正则表达式字符及文本字符所编写的过滤条件)对目标文本逐行进行匹配检查并打印出匹配到的行。

    3.语法

          grep [options] pattern [file...] 

             grep命令选项:

                        

                --color=auto  关键字高亮显示

[root@centos6 ~]# cat /etc/passwd |grep --color=auto 514
machao2:x:512:514::/root/app:/bin/bash
machao5:x:514:516::/root/machao1:/bin/bash

            -v 关键字 显示不包含关关键字的行,取反

[root@localhost ~]# cat /etc/passwd |grep -v 1017
nologin:x:1013:1018::/home/nologin:/sbin/nologin
weiyan:x:1017:1024::/home/weiyan:/bin/bash

            -i 关键字 忽略关键字的大小写

[root@localhost ~]# cat abc.txt 
aaAAbb
BBccCC
dd ee ff
Aa Bb
hello world
[root@localhost ~]# cat abc.txt |grep 'a'
aaAAbb
Aa Bb
[root@localhost ~]# cat abc.txt |grep 'A'
aaAAbb
Aa Bb
[root@localhost ~]# cat abc.txt |grep -i 'a'
aaAAbb
Aa Bb

            -n 显示的结果每行前增加行号

[root@localhost ~]# cat abc.txt |grep -i -n 'a'
1:aaAAbb
4:Aa Bb

            -c 仅显示找出的结果的行数

[root@localhost ~]# cat abc.txt |grep '[[:alpha:]]' -n
1:aaAAbb
2:BBccCC
3:dd ee ff
4:Aa Bb
5:hello world
[root@localhost ~]# cat abc.txt |grep '[[:alpha:]]' -n -c
5

            -o 仅显示匹配到的关键字,不显示同行的其他内容 

[root@localhost ~]# cat abc.txt |grep 'ee'
dd ee ff
[root@localhost ~]# cat abc.txt |grep -o 'ee'
ee

            -q 不输出任何结果,静默

[root@localhost ~]# cat abc.txt |grep -q 'ee'
[root@localhost ~]# echo $?
0          (输入指令无结果显示,$?意思是变量保存最近的命令退出状态,结果为0表示正确)

            -A #  显示关键字行及向下的n行

[root@localhost ~]# cat abc.txt |grep -A1 'ee'
dd ee ff
Aa Bb

            -B #  显示关键字行及向上的n行

[root@localhost ~]# cat abc.txt |grep -B1 'ee'
BBccCC
dd ee ff

            -C #  显示关键字行及向上n行和向下的n行

[root@localhost ~]# cat abc.txt |grep -C1 'ee'
BBccCC
dd ee ff
Aa Bb

            -e 关键字1 -e 关键字2 ……  多个关键字之间是或的关系

[root@localhost ~]# cat abc.txt |grep -e aa -e ff -e BB
aaAAbb
BBccCC
dd ee ff

            -w 关键字 匹配整个单词

[root@localhost ~]# cat abc.txt 
aaAAbb
BBccCC
dd ee ff
Aa Bb
aa AA BB
hello world
[root@localhost ~]# cat abc.txt |grep aa
aaAAbb
aa AA BB
[root@localhost ~]# cat abc.txt |grep -w aa
aa AA BB

            -E 等于egrep 使用扩展正则表达式

                -F 等于fgrep 不使用正则表达式

            这仅仅是grep命令的开始,你可能已经注意到,它对于实现各种各样的需求简直是太有用了。除了这种我们运行的这种只有一行的命令,grep还可以写成c自动的shell脚本去执行。

     4.正则表达式

        (1)由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义 ,而表示控制或通配的功能。程序支持:grep,sed,awk,vim, less,nginx,varnish等等

           (2)分为两类:基本正则表达式(Basic Regular Expression 又叫Basic RegEx 简称BREs) 

                                     扩展正则表达式(Extended Regular Expression 又叫Extended RegEx 简称EREs)

                                     Perl正则表达式 (Perl Regular Expression 又叫Perl RegEx 简称PREs)

           (3)组成:一般字符:没有特殊意义的字符

                         特殊字符(meta字符):元字符,有在正则表达式中有特殊意义

         (4)元字符及其在正则表达式上下文中的行为

\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置
* 匹配前面的子表达式零次或多次
+  匹配前面的子表达式一次或多次。+ 等价于 {1,}
?  匹配前面的子表达式零次或一次。? 等价于 {0,1}
{n} n 是一个非负整数,匹配确定的n 次
{n,} n 是一个非负整数,至少匹配n 次
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格
?  当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。
   非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串
.  匹配除 “\n” 之外的任何单个字符
$  匹配前面的正则表达式,在字符串或者行结尾处。BRE中仅在正则表达式的结尾处有特殊的含义,ERE中在任何位置都有特殊含义
[] 匹配方括号内的任一字符,其中可用连字符(-)指的连续字符的范围;^符号苦出现在方括号的第一个位置,则表示匹配不在列表中的任一字符
\< 或 \b 词首锚定,用于单词模式的左侧 
\> 或 \b 词尾锚定;用于单词模式的右侧 
\<PATTERN\> 匹配整个单词

              (5) 字符集

[::alnum] : 数字字符                [:digit:] : 数字字符                [:punct:] : 标点符号字符    
[:alpha:] : 字母字符                [:graph:] : 非空格字符              [:space:] : 空格字符    
[:blank:] : 空格与定位字符          [:lower:] : 小写字母字符            [:upper:] : 大写字母字符    
[:cntrl:] : 控制字符                [:print:] : 可显示的字符            [:xdigit:] : 16进制数字

            (6)常用正则表达式

^$                空行 
^[[:space:]]*$     空白行 
/<(.*)>.*<\/\1>|<(.*) \/>/     匹配HTML标记的正则表达式
/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //    匹配IP地址的正则表达式
"\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"   匹配IP地址的正则表达式
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*   匹配Email地址的正则表达式
http://(/[\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?    匹配网址URL的正则表达式