janneyabc 发表于 2018-8-22 10:46:08

23.Shell正则-grep,sed

六周第一次课(1月15日)

  9.1 正则介绍_grep上
  9.2 grep中
  9.3 grep下

六周第二次课(1月16日)
  9.4/9.5 sed


什么是正则
  正则就是一串有规律的字符串
  掌握好正则对于编写shell脚本有很大帮助
  各种编程语言中都有正则,原理是一样的
  本章将要学习grep/egrep、sed、awk

grep


[*][ ] grep [-cinvABC] 'word' filename
[*][ ]-c 行数
[*][ ]-i 不区分大小写
[*][ ]-n 显示行号
[*][ ]-v 取反
[*][ ]-r 遍历所有子目录
[*][ ]-A 后面跟数字,过滤出符合要求的行以及下面n行
[*][ ]-B 同上,过滤出符合要求的行以及上面n行
[*][ ]-C 同上,同时过滤出符合要求的行以及上下各n行
  举例:新建一个grep目录,将etc/passwd目录下的内容拷贝到grep目录下
  

# mkdir grep  
# cd grep/
  
# cp /etc/passwd .
  
# ls
  
passwd
  

  说明,gerp默认匹配到的字符串标注为红色,用which命令看一下,是带颜色自动显示的




[*]grep -c
  

# grep -c 'nologin' passwd  
38
  


[*]  grep -n


[*]  grep -v


[*]grep -r
  如果不加r则显示:

  

# grep 'root' /etc/  
grep: /etc/: 是一个目录
  


[*]通过grep遍历所有root文件并找到与password相关的



[*]grep -A2 会把包含root的行以及这行下面的两行打印出来



[*]grep -B2 会把包含root的行以及这行上面的两行打印出来



[*]grep -C2 会把包含root的行以及这行上下各两行打印出来


grep/egrep示例


[*][ ]grep -n 'root' /etc/passwd
[*]  [ ]grep -nv 'nologin' /etc/passwd

[*][ ]grep '' passwd



[*][ ]grep -v ''/etc/inittab
[*]grep -vn 举例,把不含数字的行打印出来,vim编辑时输入:set nu 提示行号





[*][ ]grep -v '^#' /etc/inittab  为了便于测试,需要将/etc/inittab拷贝出来到gerp目录下

  

# cp /etc/inittab .///拷贝的测试目录grep下  

  编辑inittab文件,把带#号的两行修改了,方便测试

  这在后续查找文件时,方便阅读



[*]  [ ] grep '[^0-9]' inittab


[*]  [ ] grep '^[^0-9]' inittab


[*]  [ ] grep 'r.o' passwd //‘r.o’中.表示任意一个字符
  为方便测试需要vim其中的passwd文件,并添加r&o等特殊字符


[*]  [ ]grep 'oo' passwd passwd,表示零个或多个*前面的字符,0~n个o


  

# grep 'oo*' passwd|wc -l  
46 //结果相同
  
# grep 'o*o' passwd|wc -l
  
46
  


[*]  [ ]grep '.' passwd passwd,.表示零个或多个任意字符,空行也包含在内,这样就把passwd里面所有的行都匹配到。


[*]  [ ]grep 'o{2}' passwd passwd,这里{},其内部为数字,表示前面的字符要重复的次数,需要强调的是{}左右都要加上脱义字符\,另外{}还可以表示一个范围,{1,3}表示重复1到3次前面的字符,{1,}表示大于1次重复前面字符



[*][ ]egrep 'o{2}' /etc/passwd 等同于上面的命令
  

== grep 'o\{2\}' passwd == grep -E 'o{2}' /etc/passwd  





[*][ ]egrep 'o+o'passwd,+表示匹配1个或者多个+前面的字符
  

# grep 'o\+o' passwd |wc -l  
6
  
# egrep 'o+o' passwd |wc -l
  
6
  




[*][ ]egrep 'o?t' passwd,过滤出零个或者一个指定的字符



[*][ ]egrep 'root|nologin' passwd,|表示或者,可以有多个|


  == grep -E

  

# egrep 'root|nologin' passwd|wc -l  
39
  
# grep -E 'root|nologin' passwd|wc -l
  
39
  


[*][ ]egrep '(oo){2}' passwd

sed工具使用


[*]sed -n,选项表示只显示我们要打印的行,请看-n和没有-n的区别
  

# mkdir sed  
# cd sed
  
# cp ../grep/passwd test.txt
  
# sed -n '/root/'p test.txt
  
root:x:0:0:root:/root:/bin/bash
  
operator:x:11:0:operator:/root:/sbin/nologin
  




[*]  sed -r 这里-r和grep里面-E一样,还有加上了才能有效
  支持+,*,.,|或者,与等
  

# sed -n '/o+t/'p test.txt  
# sed -nr '/o+t/'p test.txt
  
root:x:0:0:root:/root:/bin/bash
  
operator:x:11:0:operator:/root:/sbin/nologin
  
setroubleshoot:x:991:986::/var/lib/setroubleshoot:/sbin/nologin
  



[*]sed打印某行
  #sed -n '2'p test.txt //打印第二行
  sed -n '1,$'p test.txt //打印所有行
  sed -n '1,5'p test.txt//打印1~5行


  

# sed -n '1,5'p test.txt  
root:x:0:0:root:/root:/bin/bash
  
adsda:deda:deded:road:ded
  
sasdda:deda:&&DE:r&o:r
页: [1]
查看完整版本: 23.Shell正则-grep,sed