1. 正则介绍_grep
- 什么是正则
(1)正则就是一串有规律的字符串,其中包括特殊字符。
(2)掌握好正则对于编写shell脚本有很大的帮助。
(3)各种编程语言中都有正则,原理是一样的
(4)本章学习grep/egrep 、sed、awk.(熟练掌握)
grep:
gerp命令用来过滤关键字的。用单引号括起来关键词,后面跟文件名
在centos7中,使用grep命令自动添加了--color=auto选项,这样过滤出来的都会带有颜色显示了。
(1)-c选项表示打印符合要求的行数。
(2)-n显示行号。
(3)-i选项表示不区分大小写
(4)-v 选项表示取反的意思,打印不符合要求的行
(5)-r 表示遍历所有的子目录
(6)-A选项后面跟数字,过滤出符合要求的行以及下面的n行
(7)-B选项后面跟数字,过滤出符合要求的行以及上面n行
(8)-C选项后面跟数字,同时过滤出符合要求的行以及上下各n行。
- grep/egrep在正则表达式中的应用
(1)过滤出所有包含任意数字的行
(2)要想打印出不包含数字的行可以加上-v选项
(3)过滤掉所有空白行和以#开头的行
(4)过滤掉含有数字的任意一个字符
(5)过滤掉以非数字开头的行
(6)^单独跟字符或者放在方括号外面,表示以这个字符开头。当放在方括号里面来表示括号里面字符的反义。也表示“非”的意思。
grep ‘r.o’
passwd //这里的.点表示在r与o之间的任意一个字符
grep 'o*o' passwd //这里*表示0个或者多个前面的字符
grep '.*' passwd //.*表示0个或多个任意字符,空行也包括在内。其实就是表示匹配所有字符
- 指定要过滤出的字符出现次数。
这里用到了特殊符号{ },我们需要使用转义字符\,或者使用grep 加-E选项,也可以直接使用egrep 。
- 过滤出一个或多个指定的字符。
这里的符号+ ,表示匹配1个或多个+前面的字符。
grep 'o?l' paswd //这里的?号表示前面的字符出现0次或1次。
- 过滤出字符串1或者字符串2或者字符串3,使用 | 分割
egrep 'root|bash|1000' passwd //只要包含这3个字符串中的一个,都会被过滤。
- egrep中()的应用
这里用()表示一个整体,r()o之前可以是oo或者是at。
- 扩展
把一个目录下,过滤所有*.php文档中含有eval的行
grep -r --include="*.php" 'eval' /data/
2. sed
- grep命令还不够强大,它只能用于查找,而不能进行替换。这里就需要用到sed以及awk命令了,他们能把替换的文本输出到屏幕上,而且还有其他丰富的功能。它们都是流式编辑器。是针对文本的行来进行操作的。
(1) 打印出包含指定字符串的行
sed -n '/root/'p test.txt //打印出包含root的行
sed匹配没有grep那么直观,因为它没有颜色显示。
(2)同时也是支持 .
或者 *
和 +
的
sed -nr '/o+t/'p test.txt等于 sed -n '/o\+/'p test.txt \\ 这里的-r选项就表示不需要转义特殊字符的意思
(3)指定要过滤出 的字符出现的次数。
sed -nr '/o{2}/'p test.txt
(4)过滤出字符串1或者字符串2
sed -nr '/root|var/'p test.txt
使用-e选项,效果是一样的
sed -e '/root/'p -e '/var/'p -n test.txt
(5)打印指定的行
sed -n '3'p test.txt //需要打印第几行就写数字几, -n选项的作用就是只打印我们需要的那行,其他的不显示。
打印多行可用,隔开 。例:
sed -n '3,8'p test.txt //打印第3行到第8行
sed -n '3,$'p test.txt //打印第3行到最后一行。
(6)其他应用
sed -n '/^s/'p test.txt //打印出以s开头的行。
sed -n '/in$/'p test.txt //打印出以in结尾的行
sed -n '/.+root.+/'p test.txt //打印出root字符串在行中间的行。
(7)匹配时不区分大小写
sed -n '/var/'Ip test.txt //匹配var字符串,不区分大小写。且I不能跟在-n后面
(8)删除指定的行
sed '3'd test.txt //字母‘d’就是删除的意思,但是并不会删除真实文件的内容,这里只是不显示出来而已。要删除真实内容,可以加上-i 选项。
sed -i '1,15'd test.txt
(9)指定性删除
sed -i '/home/'d test.txt //删除包含home字符串的行。
- sed的替换功能
替换字符串,与vim中的替换方式很类似。
sed '1,5s/root/toor/g test.txt //将文件中第一到第五行中所有出现的root替换为toor
sed -r '1,5s/ro+/b/g' test.txt //将1-5行中的ro+替换为b ,加上-r选项就可以不使用转义字符。
sed 's@/sbin/nologin@315@g' test.txt // 不加-r选项可以将分割符换成@或者#。
head test.txt |sed 's/[a-zA-Z]//g' //将所有的英文字母删除,也就是替换为空。
head |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' test.txt // 调换2个字符串的位置,其中小括号()内看做是一个整体。将第3个括号和第1个括号内的内容调换。
在某行前添加指定内容。
sed 's/^.*$/123&/' test.txt //文件中所有行的行首添加123字符。这里的&表示(^.*$/)
3. awk
awk兼具sed所有的功能,并且更加强大。它也是流式编辑器,针对文档中的行来操作。一行一行的执行。
(1)截取文档中的某个字段
head -n2 test.txt |awk -F ': ' '{print $1}' //-F用来指定分隔符。不加-F选项,默认使用空格或者tab为分隔符,print为打印的意思。 $1表示打印第1字段 $0表示整行
如果需要截取多个字段,可以在{ }中用“,”来分隔
(2)修改分隔符号
awk -F ':' '{print $1"#"$5"#"$6}' test.txt //将之前的:分隔符号替换为#,必须使用双引号引起来。
(3)匹配功能
awk '/oo/' test.txt //匹配出现oo的行
(4)匹配某段中出现的字符
awk -F ':' '$1 ~ /oo/' test.txt
awk命令可以直接使用特殊符号而不用使用转义字符
(5)支持多个条件匹配
awk -F ':' '/oo/ {print $1,$4} /user1/ {print $1,$6}' test.txt
(6)条件操作符
awk -F ':' '$3==0' test.txt //这里表示打印第3段等于0的行,要想等于必须使用2个=,不然就是赋值了。
也可以这样来打印:
awk -F ':' '$3>=500 {print $0}' test.txt //第三段大于等于500
在和数字进行比较时,若把比较的数字用双引号括起来,那么awk不会认为是数字,而会认为是字符,那么就会按ASCII码表来排序,得不到想要的结果
(7)打印出某段不等于xx的行
awk -F ':' '$7!="/sbin/nologin" {print $0} ' test.txt //字符作为判断条件则是要使用双引号括起来的 !=表示不等于
(8)2字段之间比较
awk -F ':' '$3<$4' test.txt //打印第3段小于第4段的行,比较的是数字
awk -F ':' '$3==$4' test.txt //打印第3段与第4段相同的行。
(9)在2个字符之间查找
awk -F ':' '$3>"4" && $3<"8"' test.txt //第3段大于某个字符并且小于某个字符 。这里数字使用了双引号,所以表示字符
- awk的内置变量
(1)OFS和-F选项有类似的功能,也是用来定义分隔符的,但是它是在输出的时候定义的
(2)变量NR的用法 表示行号
(3)变量NF表示用分隔符分隔后一共有多少段
(4)使用NR打印前多少行
awk -F ':' 'NR<=10' test.txt //打印前10行
(5)打印2个条件同时满足的行
awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt //打印前十行里面第一段包含root或者sync的行
(6)2个变量的应用
(7)赋值
赋值后没有了分隔符号了,使用OFS重新定义
(8)求和
awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt //每行的第三段数字累计相加
课堂笔记:
raid5和raid6的区别:
grep -A1 :过滤当前行和下一行
去除以#开头的行和空行
- grep -E = egrep
练习题:
sed:
1.把/etc/passwd 复制到/root/test.txt,用sed打印所有行
6.替换test.txt 中 ‘root’ 为 ‘toor’
答:sed '1,$s/root/toor/g' test.txt
7.替换test.txt中 ‘/sbin/nologin’ 为 ‘/bin/login’
答:sed '1,$s/sbin\/nologin/bin\/login/g' test.txt
答:sed '5,10s/[0-9]//g' test.txt
9.删除test.txt 中所有特殊字符(除了数字以及大小写字母)
答:sed 's/[^0-9a-zA-Z]//g' test.txt
答:sed -ri 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' test.txt
11.把test.txt中出现的第一个数字和最后一个单词替换位置
答:sed -r 's/([^0-9][^0-9]*)([0-9][0-9]*)([^0-9].*)([^a-zA-Z])([a-zA-Z][a-zA-Z]*$)/\1\5\3\4\2/' test.txt
答:sed -r 's/([^0-9][^0-9]*)([0-9][0-9]*)([^0-9].*$)/\1\3\2/' test.txt
13.在test.txt 20行到末行最前面加 ‘aaa:’
答:sed -r '20,$s/(.*)/aaa:&/' test.txt
awk:
1.用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)
4.用 ‘:’ 作为分隔符,查找第一段为 ‘root’ 的行,并把该段的 ‘root’ 换成 ‘toor’ (可以连同sed一起使用)
答:awk -F ':' '$1=="root"' test.txt | sed 's/root/toor/'
答:awk -F ':' '{print $NF}' test.txt
8.用 ‘:’ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@’ 连接 (例如,第一行应该是这样的形式
答:awk -F ':' '{OFS="@"} {print $1,$NF}' test.txt
答:awk -F ':' '{tot=tot+$4}; END {print tot}' test.txt