正则
正则的定义
正则就是一串有规律的字符串,其中包括特殊字符。
掌握好正则对于编写shell脚本有很大的帮助。
各种编程语言中都有正则,原理是一样的
grep
格式: grep 【-cinvrABC】‘字符’ filename
-c 选项表示打印符合要求的行数
-n 选项表示输出符合要求的行以及行号
-i选项表示不区分大小写
-v 选项表示取反的意思,打印不符合要求的行
-r 表示遍历所有的子(及孙目录)目录
-A 选项后面跟数字,过滤出符合要求的行以及下面的n行
-B 选项后面跟数字,过滤出符合要求的行以及上面n行
-C 选项后面跟数字,同时过滤出符合要求的行以及上下各n行
‘【0-9】’ 列出包含所有数字的行
-v ‘^#’ -v ‘^$’ 列出过滤掉所有以#开头 和空行的行
??? grep ^[0-9]
/etc/passwd 以0-9开头的行
扩展
[]内外^是有区别的
[^字符]
表示列出除[]内字符之外的字符
.表示任意一个字符
*表示任意重复字符
.*表示零个或多个任意字符
{}内部为数字,表示前面的字符要重复的次数 字符后 数字后要加上转义字符\
{}还可以表示一个范围 x{a,b} 表示重复a到b次的字符 b还可为空 表示大于等于a次
- 表示匹配一个或多个+前面的字符
?表示匹配零个或一个指定的字符
| 表示匹配字符串1或者字符串2
()表示()内为一个整体
扩展
egrep 后可不带转义符号 或者 grep -E
sed
grep命令还不够强大,它只能用于查找,而不能进行替换。这里就需要用到sed以及awk命令了,他们能把替换的文本输出到屏幕上,而且还有其他丰富的功能。它们都是流式编辑器。是针对文本的行来进行操作的。
sed 格式为 sed -n '/n/'p filename
1.打印某行
sed -n 'n’p filename
$
尾 2,5 2至5行 5,$ 5至最尾行
2.打印包含特殊字符的行
sed -n '/root/'p mm.txt
sed也是支持. * 和+的 需要脱义前面加\的
如果不想脱义 前面加r
例如 sed -nr '/o+t/'p mm.txt
3.过滤字符串1或者字符串2(都匹配 会打印俩次 -e可多次使用)
sed -nr '/root|var/'p mm.txt
-e 也是或者的意思
4.不区分大小写
sed -n '/n/'IP mm.txt
5.删除某些行 (只删除打印 文件没修改)
sed '1,20’d mm.txt
删除所有字母 (其实就是个替换为空的过程)
6.-i 直接修改文件的内容
7.替换功能(会全部打印 )
sed ‘n1,n2s/x1/x2/g’ filename(n1,n2 不加 指全行)
正则表达式 不脱义前需加 -r
8.调换字符串的位置
格式为 sed -r ‘s/([:]+)?.*)?[:]+)/\3:\2:\1/’ //sed命令支持管道符,使用小括号把要替换的字符打包成一个整体。
.* 贪婪匹配 一直会匹配到最后
9.所有字符串前添加字符
sed -r ‘s/(.*)/aaa:&/’ mm.txt
&表示括号内的整体
awk
1.截取文档中的某段
打印头10行的第一段
head -10 mm.txt |awk -F ‘: ’ ‘{print $1}’ //-F用来指定分隔符。不加-F选项,默认使用空格或者tab为分隔符,print为打印的意思。 $1表示打印第1字段 $0表示整行
2.可以打印多段’{print $1,$2,$4}’
可自定义分隔符 ‘{print $1’’#’’$2’’#’’$4}’ 自定义分隔符用双引号 引起
3.匹配字符或字符串
awk ‘/oo/’ mm.txt
awk -F ‘:’ '$1 ~ /oo/'mm.txt 匹配 第一段oo字符的行打印出来
支持正则表达式 第一段一个或者一个以上的o的行
扩展 awk 不需要脱义字符
-
awk -F ‘:’ ‘$3==0’ test.txt //这里表示打印第3段等于0的行,要想等于必须使用2个=,不然就是赋值了。
== 等于 >大于>=大等于
< 小于
<= 小等于
!= 不等于
awk -F ‘:’ ‘$3==$4’ mm.txt 打印第三段和第四段相同的行
5.awk的内置变量
OFS 定义输出分隔符的
NR 表示行号
NF 表示用分隔符分隔后一共多少段
NR 作为判断条件