1.1 功能说明

为处理大量的字符串而定义的一套规则和方法

一般以行为单位处理的

1.2 符号说明

常用:

符号

说明

^

...开头,例如:^oldboy,以oldboy开头

$

...结尾,例如:oldboy$,以oldboy结尾

^$

表示空行

.

只能代表任意一个字符

\

转义字符号,例如:\.,代表.本身

*

重复0个或多个前面的一个字符

.*

匹配所有任意一个字符

[abc]

匹配[]里的包含abc的任意字符 [a-zA-Z0-9]

[^abc]

匹配[]里不包含abc的任意字符

a\{n,m\}

匹配重复anm

a\{n, \}

匹配重复a至少n

a\{n \}

匹配重复an

a\{,n \}

匹配重复a至多n

扩展:

符号

说明

+

匹配重复前面一个字符的“1个或1个以上”

?

匹配重复前面一个字符的“0个或1个”

|

表示同时过滤多个字符

()

分组过滤,后向引用

 

1.3 实践操作

通用例子:

[root@ben-test ~]# cat -n aa.txt

     1  aa

     2  bb

     3

     4

     5  cc

     6  I LIKE you

     7  access bike

     8  0000

 

实例1-1  .的使用例子

匹配aa.txt任意一个字符,空行没有字符,故不显示

[root@ben-test ~]# grep -n "." aa.txt

1:aa

2:bb

5:cc

6:I LIKE you

7:access bike

8:0000

 

实例1-2  [abc]的使用例子

匹配aa.txt中的ay字符

[root@ben-test ~]# grep "[ay]"aa.txt  

aa

I LIKE you

accessbike

 

实例1-3  [^abc]的使用例子

匹配aa.txt中不含ay字符的内容

[root@ben-test ~]# grep "[^ay]" aa.txt

bb

cc

I LIKE you

access bike

0000

 

实例1-4  匹配aa.txt0的字数

[root@ben-test ~]# grep "0\{3\}"aa.txt         

0000

[root@ben-test ~]# grep "0\{1,3\}"aa.txt 

0000

[root@ben-test ~]# grep "0\{3,\}"aa.txt  

0000

[root@ben-test ~]# grep "0\{,3\}"aa.txt 

aa

bb

 

 

cc

I LIKE you

access bike

0000

 

实例1-5  ?的使用例子

[root@ben-test ~]# grep -E "ac?"aa.txt   

aa

accessbike

[root@ben-test ~]# grep -E "aac?" aa.txt

aa

 

实例1-6  |的使用例子

[root@ben-test ~]# grep -E "you|bi"aa.txt

I LIKE you

access bike

 

实例1-7  ()的使用例子

1、取出ifconfig eth0中的ip地址

[root@ben-test ~]# ifconfig eth0

eth0     Link encap:Ethernet  HWaddr00:0C:29:2B:45:3E 

         inet addr:192.168.137.10 Bcast:192.168.137.255 Mask:255.255.255.0

         inet6 addr: fe80::20c:29ff:fe2b:453e/64 Scope:Link

          UPBROADCAST RUNNING MULTICAST MTU:1500  Metric:1

          RXpackets:11385 errors:0 dropped:0 overruns:0 frame:0

          TXpackets:6854 errors:0 dropped:0 overruns:0 carrier:0

         collisions:0 txqueuelen:1000

          RXbytes:1088920 (1.0 MiB)  TX bytes:884216(863.4 KiB)

[root@ben-test ~]# ifconfig eth0 |sed -nr's#^.*dr:(.*)  Bc.*$#\1#gp'

192.168.137.10

 

2、取出644字符串

[root@ben-test ~]# stat aa.txt

  File:`aa.txt'

  Size:39              Blocks: 8          IO Block: 4096   regular file

Device: 802h/2050d     Inode: 134363      Links: 1

Access: (0644/-rw-r--r--)  Uid: (   0/    root)   Gid: (   0/    root)

Access: 2016-11-15 00:34:08.845000977 +0800

Modify: 2016-10-26 22:38:44.419903187 +0800

Change: 2016-10-26 22:38:44.419903187 +0800

[root@ben-test ~]# stat aa.txt |sed -nr's#^.*\(0(.*)/-.*$#\1#gp'

644

                                                    

2、/etc/passwd文件中的第一列和最后一列调换

[root@ben-test ~]# head -1 /etc/passwd |sed -nr's#(^.*)(:.*:)(/.*$)#\3\2\1#gp' 

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

等同于:

[root@ben-test ~]# head -1 /etc/passwd |sed -nr's#([^:]+)(:.*:)(/.*$)#\3\2\1#gp'

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

思路:使用()取出对应的第1列和第7列,其他列为一个(),第1列和第7列对应输出的\1\3调换