第十一课正则

正则表达式:它使用单个字符串来描述或匹配一系列符合某个句法规则的字符串。

1、     grep/egrep工具的使用

命令格式:grep[-cinvABC]  ‘word’ filename

其常用的选项如下:

-c:表示打印符合要求的行数

-i:表示忽略大小写

-n:表示输出符合要求的行及行号

-v:表示打印不符合要求的行

-A:后面跟一个数字(有无空格都可以),表示打印符合要求的行以及下面两行

-B:后面跟一个数字,表示打印符合要求的行以及上面两行

-C: 后面跟一个数字,表示打印符合要求的行以及上下各两行

实例1、过滤出带有某个关键词的行,并输出行号:

[root@localhost /]# grep -n 'root'/tmp/test/2.txt

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

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

过滤出含有关键词root的行,并输出了在第一行和第十行

实例2、过滤出不带有某个关键词的行,并输出行号:

[root@localhost /]# grep -nv'nologin' !$

grep -nv 'nologin' /tmp/test/2.txt

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

6:sync:x:5:0:sync:/sbin:/bin/sync

7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

8:halt:x:7:0:halt:/sbin:/sbin/halt

42:aming:x:1000:1000:aming:/home/aming:/bin/bash

43:user1:x:1001:1001::/home/user1:/bin/bash

44:user12:x:1002:1002::/home/user12:/bin/bash

过滤出不带有关键词nologin的行,并输出了行号。

实例3、过滤出所有包含数字的行;

[root@localhost /]# head -n5/tmp/test/2.txt |grep '[0-9]'

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

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

实例4、过滤出所有不包含数字的行:

[root@localhost /]# grep -v '[0-9]'/tmp/test/2.txt

实例5、过滤掉所有以#开头的行:

root@localhost /]# cat !$

cat /tmp/test/3.txt

fasdfadsf

1232323

#fdfsadf

#ewrew

 

[root@localhost /]# grep -v '^#' !$

grep -v '^#' /tmp/test/3.txt

fasdfadsf

1232323

实例6、过滤掉所有空行和以#开头的行

[root@localhost /]# grep -v '^$'/tmp/test/3.txt |grep -v '^#'

fasdfadsf

1232323

在正则表达式中,^表示行的开始,$表示行的结尾,空行则可以用^$表示。^在[]内表示反向选择,在[]外表示定位在行首

[root@localhost /]# grep '^[^a-zA-Z]'!$

grep '^[^a-zA-Z]' /tmp/test/3.txt

1232323

#fdfsadf

#ewrew

^[^a-zA-Z]表示

[root@localhost /]# grep '[^a-zA-Z]'/tmp/test/3.txt

1232323

#fdfsadf

#ewrew

实例7、过滤出任意一个字符和重复字符:

[root@localhost /]# grep 'd.f'/tmp/test/3.txt

Fasdfadsf

.表示任意一个字符,重点是一个字符。表示把d和f之间任意一个字符过滤出来。

[root@localhost /]# grep 'aaa*' !$

grep 'aaa*' /tmp/test/3.txt

aaffff

aaaaaaaaaf

aaaf

[root@localhost /]# cat !$

cat /tmp/test/3.txt

fasdfadsf

1232323

#fdfsadf

#ewrew

FFFF

aaffff

afff

aaaaaaaaaf

f

aaaf

aaa*表示aa,aaa,aaa或者更多的a,或者零个a,就是没有1个a。

*表示零个或多个*前面的字符,没有1个。

[root@localhost /]# grep '.*'/tmp/test/3.txt |wc -l

16

.*表示零个或多个任意字符,空行也包含在内。

实例8、指定要过滤出的字符出现次数:

[root@localhost /]# grep 'a\{2\}' /tmp/test/3.txt

aaffff

aaaaaaaaaf

aaaf

[root@localhost /]# grep 'a\{3\}'/tmp/test/3.txt

aaaaaaaaaf

aaaf

符号{},其内部为数字,表示前面的字符要重复的次数。{}左右都需要加上转义字符\,另外使用{}还可以表示一个范围,具体格式{n1,n2},其中n1<n2,表示重复n1到n2次前面的字符,n2还可以为空,这时表示大于等于n1次。

实例9、过滤出一个或多个指定的字符:

[root@localhost /]# egrep 'f+'/tmp/test/3.txt

fasdfadsf

#fdfsadf

aaffff

afff

aaaaaaaaaf

f

aaaf

aaaaaf

aaaaaaf

egrep使用符号+,表示匹配1个或多个+前面的字符,+是不支持grep的,{}也可以被egrep使用,而且不需要加\转义。使用符号?,表示匹配零个或一个指定的字符。

实例10、过滤出字符串1或者字符串2:

[root@localhost /]# egrep 'fa|af'/tmp/test/3.txt

fasdfadsf

aaffff

afff

aaaaaaaaaf

aaaf

aaaaaf

aaaaaaf

 

sed工具的使用:

实例1、打印某行:

格式:sed –n ‘n’p filename,单引号内的n是一个数字,表示第几行,-n的作用是只显示我们要打印的行,无关的内容不显示,如果去掉-n,则会把所有的行都打印出来:

[root@localhost /]# sed -n '2'p !$

sed -n '2'p /tmp/test/3.txt

1232323

也可以指定区间打印:

[root@localhost /]# sed -n '2,4'p/tmp/test/3.txt

1232323

#fdfsadf

#ewrew

实例2、打印包含某个字符串的行:

[root@localhost /]# sed -n '/af/'p/tmp/test/3.txt

aaffff

afff

aaaaaaaaaf

aaaf

aaaaaf

aaaaaaf

字符串两边要加/

重点:sed命令加上-e选项可以实现多个行为:

[root@localhost /]# sed -e '2'p -e'/F/'p -n /tmp/test/3.txt

1232323

FFFF

实例3、删除某些行:

[root@localhost /]# cat !$

cat /tmp/test/3.txt

fasdfadsf

1232323

#fdfsadf

FFFF

aaffff

afff

f

aaaf

aaaaaf

aaaaaaf

[root@localhost /]# sed '1'd !$

sed '1'd /tmp/test/3.txt

1232323

#fdfsadf

FFFF

aaffff

afff

f

aaaf

aaaaaf

aaaaaaf

这里参数d表示删除的动作,不仅可以指定删除的单行,还可以删除多行:

[root@localhost /]# sed '1,3'd/tmp/test/3.txt

FFFF

aaffff

afff

f

aaaf

aaaaaf

aaaaaaf

还可以删除匹配某个字符的行:

[root@localhost /]# sed '/FFF/'d/tmp/test/3.txt

fasdfadsf

1232323

#fdfsadf

aaffff

afff

f

aaaf

aaaaaf

aaaaaaf

还可以删除从某一行开始到文档最后一行:

[root@localhost /]# sed '7,$'d/tmp/test/3.txt

fasdfadsf

1232323

#fdfsadf

FFFF

aaffff

afff

实例4、替换字符或者字符串:

[root@localhost /]# sed '1,2s/1/2/g'!$

sed '1,2s/1/2/g' /tmp/test/3.txt

2222

2222323

上例中,参数s表示替换动作,参数g表示本行全局替换,注意是本行哦,如果不加g则只替换本行的第一个字符。

除了使用/作为分隔符外,还可以使用其他特殊字符,例如#和@。

删除文档中所有的数字:

[root@localhost /]# sed 's/[0-9]//g'!$

sed 's/[0-9]//g' /tmp/test/3.txt

 

 

#fdfsadf

FFFF

aaffff

afff

实例5、调换两个字符串的位置:

[root@localhost /]# sed '1,2s/\(fa\)\(.*\)\(fe\)/\3\2\1/' /tmp/test/3.txt

fe#fb#fc#fd#fa

ca#cb#cc#cd#ce

aaffff

afff

f

aaaf

aaaaaf

aaaaaaf

\(fa\)\(.*\)\(fe\)表示一整行的内容,()在sed中属于特殊符号,必须在前面加转义字符\,\(fa\)代表1,\(.*\)代表2,\(fe\)代表3,则调换为\3\2\1.

还可以常常在某一行前后增加指定内容,需使用&符号:

在前增加:

[root@localhost /]# sed '1,2s/^.*$/123&/'/tmp/test/3.txt

123fa#fb#fc#fd#fe

123ca#cb#cc#cd#ce

在后增加:

[root@localhost /]# sed '1,2s/^.*$/&123/' !$

sed '1,2s/^.*$/&123/' /tmp/test/3.txt

fa#fb#fc#fd#fe123

ca#cb#cc#cd#ce123

实例6、直接修改文件内容,使用-i选项:

[root@localhost /]# sed -i 's/#/:/g' !$

sed -i 's/#/:/g' /tmp/test/3.txt

[root@localhost /]# cat !$

cat /tmp/test/3.txt

fa:fb:fc:fd:fe

ca:cb:cc:cd:ce

awk工具的使用

实例1、截取文档中的某个段:

[root@localhost test]# cat 3.txt

fa:fb:fc:fd:fe

ca:cb:cc:cd:ce

aaffff

afff

f

aaaf

aaaaaf

aaaaaaf

[root@localhost test]# head -n2 3.txt |awk -F ':''{print $1}'

fa

ca

-F选项的作用是指定分隔符。如果不加-F选项,则以空格或者tab为分隔符。print为打印的动作,用来打印某个字段。$1为第一个字段,$2为第二个字段。但$0比较特殊,表示整行:

[root@localhost test]# head -n2 3.txt |awk -F ':''{print $0}'

fa:fb:fc:fd:fe

ca:cb:cc:cd:ce

实例2、匹配字符或者字符串:

[root@localhost test]# awk '/oo/' !$

awk '/oo/' 1.txt

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

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

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

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

setroubleshoot:x:994:991::/var/lib/setroubleshoot:/sbin/nologin

更强大的匹配,如下所示:

[root@localhost test]# awk -F ':' '$1 ~/oo/' !$

awk -F ':' '$1 ~/oo/' 1.txt

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

setroubleshoot:x:994:991::/var/lib/setroubleshoot:/sbin/nologin

上例让第一段匹配00,~是匹配的意思。

awk还可以多次匹配,如下所示:

[root@localhost test]# awk -F ':' '/root/ {print$1,$3} /test/ {print $1,$3}' 1.txt

root 0

test 1006

operator 11

实例3、条件操作符:

 

awk语法结构:
awk -F ':' 'BEGIN{
语句} {if(条件){语句1;语句2;语句3} }END{语句}'filename

猜你喜欢

转载自blog.csdn.net/zanghaos/article/details/80601148