正则表达式

目录

grep

grep常用选项

awk

awk常用关键字

sed

sed选项含义:

sed例子


正则表达式原理图

grep

1. * 以前一个字符作为参照匹配0次或多次

grep "a*" e-mail

2. ^ 以后一个字符参照作为开头

3.$以前一个字符作为参照,表示结尾

4..任意字符出现一次

5. \转义

6.[ ] 集合,一次仅代表一个字符,[^]取非

7.{m,n} 以前一个为参照,该字符连续出现的频率m到n次(可省略不能全部省略)

8.+ 出现一次或多次

例1 匹配电话号码

grep "^1[3-9][0-9]{9}$" phone

例2 匹配邮箱

grep "^[_a-zA-Z0-9]\+@[a-zA-Z0-9]\+\.\(com\|net\|cn\)$" e-mail

9. ? 0次或一次

以下为扩展

10. \b匹配单词边界 例:er\b never ere 会匹配never

11.\B 匹配非单词边界

12. \cx 匹配控制字符(x可变)

13. \r 回车符

14. \n换行符

15. \f 换页符

16. \t 制表符

17. \v 垂直制表符

18. \d 数字集合[0-9]

19. \D 非数字集合[^0-9]

20. \w [_a-zA-Z0-9]

21. \W

22.  \s [\r\n\f\t\v]

23. \S

grep常用选项

-c 显示匹配条数

-i 匹配时不区分大小写

-h 匹配多文件时只显示匹配结果不显示文件名

-l 匹配多文件时不显示匹配结果只显示文件名

-v 显示非匹配结果

-n 显示匹配项的行及匹配结果

awk

awk是一门语言,可以实现定义变量,流程结构循环等等

awk除了可以使用传统的正则方式外还可以通过域分割便利的抽取指定数据(默认分隔符为空格)

awk在使用时可以指定分割的关键字:awk通过关键字对指定的字符串进行切割,切割后形成位置变量,用户访问位置变量可以直接使用切割数据。

awk语法为:awk -option '{section}' filename

awk常用关键字

-F 指定分隔符  例 -F":" 以冒号分割

例子1:awk -F":" 'BEGIN{i=0;printf "自定义表头\n"}{printf "%d\t%-20s\t%-10s\t%-40s\t%-40s\n",++i,$1,$3,$6,$7} END{printf "表尾\n"}' /etc/passwd

其中:BEGIN{}开始命令 ;{}循环命令 ;END{}结尾命令

例子2:awk -F":" -f secfile /etc/passwd  此句直接调用写在secfile文件中的section

secfile如下

BEGIN{
    i=0;
    printf "自定义表头\n";
}
{
    printf "%d\t%-20s\t%-10s\t%-40s\t%-40s\n",++i,$1,$3,$6,$7;
} 
END{
printf "表尾\n";
}

例子3:awk脚本 #!/usr/bin/awk

awk脚本如下(文件名为awkshell)

#!/usr/bin/awk -f
BEGIN{
    i=0;
    FS=":"
    printf "自定义表头\n";
}
{
    printf "%d\t%-20s\t%-10s\t%-40s\t%-40s\n",++i,$1,$3,$6,$7;
} 
END{
printf "表尾\n";
}

然后执行  ./awkshell /etc/passwd

awk正则表达式

awk -option '/正则表达式/{section}' filename : {}前面的表示条件

sed

流编辑流处理工具:sed是开发者非常喜欢的工具,如果对多文件进行统计与修改,sed很好用

sed(命令) -option scrip filename

awk和grep可以查找匹配项,但是没有直接修改原文件的功能,而sed可以直接修改原文件

-i 可修改原文件

sed选项含义:

 

    --version            显示sed版本。

    --help               显示帮助文档。

    -n,--quiet,--silent    静默输出,默认情况下,sed程序在所有的脚本指令执行完毕后,将自动打印模式空间中的内容,这些选项可以屏蔽自动打印。

    -e script              允许多个脚本指令被执行。

    -f script-file,

    --file=script-file        从文件中读取脚本指令,对编写自动脚本程序来说很棒!

    -i,--in-place        直接修改源文件,经过脚本指令处理后的内容将被输出至源文件(源文件被修改)慎用!

     -l N, --line-length=N    该选项指定l指令可以输出的行长度,l指令用于输出非打印字符。

     --posix            禁用GNU sed扩展功能。

     -r, --regexp-extended   在脚本指令中使用扩展正则表达式

     -s, --separate        默认情况下,sed将把命令行指定的多个文件名作为一个长的连续的输入流。GNU sed则允许把他们当作单独的文件, 这样如正则表达式则不进行跨文件匹配。

     -u, --unbuffered      最低限度的缓存输入与输出。

sed例子

[wbm@wmblinux64 05sed]$ sed -n 'p' test.txt 

aaaa=111

bbbb=222

 

cccc=3333

 

 

dddd=44444

[wbm@wmblinux64 05sed]$

包括空行

 
 
[wbm@wmblinux64 05sed]$ sed -n '3,/ddd/p' testfile.txt  从第三行开始匹配,打印到含有ddd的行

 
 
[wbm@wmblinux64 05sed]$ sed -n '/^$/=' testfile.txt  打印空行

3

5

6
 
[wbm@wmblinux64 05sed]$ sed -n -e '/^$/p' -e '/^$/=' testfile.txt 即打印空行又打印行号

 

3

 

5

 

6

 
 
以上仅是sed程序本身的选项功能说明

 这里就简单介绍几个脚本指令操作作为sed程序的例子。

    a,append        追加

    i,insert        插入

    d,delete        删除

    s,substitution  替换
 
查找替换应用举例

sed  '2a TYPE=Ethernet'  test.txt    第二行后添加TYPE=Ethernet

sed  '3i  TYPE=Ethernet'  test.txt   第三行前添加TYPE=Ethernet

sed  's/yes/no/g'     test.txt       将样本文件中的所有yes替换为no

sed  '3,4d'  test.txt                删除第三行内容

总结:以上大多数操作指令,都依据行号定位操作对象(地址),如:2a即第二行后添加。
但实际情况可能大多数情况你并不确定你要操作对象(地址)的行号,这时更多的我们会使用正则表达式确定操作对象(地址)。
 
下面是使用正则表达式定位操作行的示例:

sed  '/222/a iiii=1111 '  testfile.txt

匹配到包含222的行,并在其后添加iiii=1111

sed  '/^aaa/d'  testfile.txt

匹配以aaaa开始的行,并删除改行

 
 
需要执行多个指令时,可以使用以下三种方法:
#sed  's/yes/no/;s/static/dhcp/'  test.txt            注:使用分号隔开指令。

#sed  -e  's/yes/no/'    -e  's/static/dhcp/'  test.txt    注:使用-e选项。

#sed '
    >s/yes/no/
    >s/static/dhcp/'  test.txt                                    
#注:利用分行指令。 然而在命令行上输入过长的指令是愚蠢的,这时就需要-f选项指定sed脚本文件,在脚本#文件中可以包含多行指令,而且便于修改!
 

sed脚本文件与awk类似

注:匹配多个选项可以把他们放在文件名之后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值