linux正则表达式

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 表示遍历所有的子目录 

将/etc/目录下所有包含root字符的文件内容打印出来

(6)-A选项后面跟数字,过滤出符合要求的行以及下面的n行 

过滤出root行以及下面两行

(7)-B选项后面跟数字,过滤出符合要求的行以及上面n行

过滤出root行以及上面两行

 (8)-C选项后面跟数字,同时过滤出符合要求的行以及上下各n行。

过滤出root行以及上下两行

 

  • 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次。 
这里ool将不会匹配出来
  • 过滤出字符串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
如果2个要求都满足,那么会打印2次。

(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打印所有行

答:sed -n '1,$'p test.txt

2.打印test.txt的3到10行

答:sed -n '3,10'p test.txt

3.打印test.txt 中包含 ‘root’ 的行

答:sed -n '/root/'p test.txt

4.删除test.txt 的15行以及以后所有行

答:sed  '15,$'d test.txt

5.删除test.txt中包含 ‘bash’ 的行

答:sed  '/bash/'d test.txt

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

8.删除test.txt中5到10行中所有的数字

答:sed  '5,10s/[0-9]//g' test.txt

9.删除test.txt 中所有特殊字符(除了数字以及大小写字母)

答:sed  's/[^0-9a-zA-Z]//g' test.txt  

10.把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

12.把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)

答:awk '{print $0}' test.txt

2.查找所有包含 ‘bash’ 的行

答:awk '/bash/ ' test.txt

3.用 ‘:’ 作为分隔符,查找第三段等于0的行

答:awk -F ':' '$3==0' test.txt

4.用 ‘:’ 作为分隔符,查找第一段为 ‘root’ 的行,并把该段的 ‘root’ 换成 ‘toor’ (可以连同sed一起使用)

答:awk -F ':' '$1=="root"' test.txt | sed 's/root/toor/'

5.用 ‘:’ 作为分隔符,打印最后一段

答:awk -F ':' '{print $NF}' test.txt

6.打印行数大于20的所有行

答:awk -F':' 'NR>20' test.txt

7.用 ‘:’ 作为分隔符,打印所有第三段小于第四段的行

答:awk -F':' '$3<$4' test.txt

8.用 ‘:’ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@’ 连接 (例如,第一行应该是这样的形式 

答:awk -F ':' '{OFS="@"} {print $1,$NF}' test.txt

9.用 ‘:’ 作为分隔符,把整个文档的第四段相加,求和

答:awk -F ':' '{tot=tot+$4}; END {print tot}' test.txt


 

 

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值