目录
正则表达式原理图
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类似
注:匹配多个选项可以把他们放在文件名之后