设为首页 收藏本站
查看: 874|回复: 0

23.Shell正则-grep,sed

[复制链接]

尚未签到

发表于 2018-8-22 10:46:08 | 显示全部楼层 |阅读模式
六周第一次课(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目录下
  

[root@localhost ~]# mkdir grep  
[root@localhost ~]# cd grep/
  
[root@localhost grep]# cp /etc/passwd .
  
[root@localhost grep]# ls
  
passwd
  

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

DSC0001.jpg



  • grep -c
  

[root@localhost grep]# grep -c 'nologin' passwd  
38
  


  •   grep -n
    DSC0002.jpg


  •   grep -v
    DSC0003.jpg


  • grep -r
    DSC0004.jpg

      如果不加r则显示:

  

[root@localhost grep]# grep 'root' /etc/  
grep: /etc/: 是一个目录
  


  • 通过grep遍历所有root文件并找到与password相关的
DSC0005.jpg



  • grep -A2 会把包含root的行以及这行下面的两行打印出来
DSC0006.jpg



  • grep -B2 会把包含root的行以及这行上面的两行打印出来
DSC0007.jpg



  • grep -C2 会把包含root的行以及这行上下各两行打印出来
DSC0008.jpg


grep/egrep示例


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

  • [ ]  grep '[0-9]' passwd
DSC0009.jpg



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

DSC00011.jpg

DSC00012.jpg



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

  

[root@localhost grep]# cp /etc/inittab ./  //拷贝的测试目录grep下  

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

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



  •   [ ] grep '[^0-9]' inittab
    DSC00015.jpg


  •   [ ] grep '^[^0-9]' inittab
    DSC00016.jpg


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


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


  

[root@localhost grep]# grep 'oo*' passwd|wc -l  
46 //结果相同
  
[root@localhost grep]# grep 'o*o' passwd|wc -l
  
46
  


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


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

    DSC00021.jpg


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

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

DSC00022.jpg

DSC00023.jpg



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

[root@localhost grep]# grep 'o\+o' passwd |wc -l  
6
  
[root@localhost grep]# egrep 'o+o' passwd |wc -l
  
6
  

DSC00024.jpg



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



  • [ ]  egrep 'root|nologin' passwd,|表示或者,可以有多个|
DSC00026.jpg


  == grep -E

  

[root@localhost grep]# egrep 'root|nologin' passwd|wc -l  
39
  
[root@localhost grep]# grep -E 'root|nologin' passwd|wc -l
  
39
  


  • [ ]  egrep '(oo){2}' passwd
    DSC00027.jpg


sed工具使用


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

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

DSC00028.jpg



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

    [root@localhost sed]# sed -n '/o+t/'p test.txt  
    [root@localhost sed]# 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
      

    DSC00029.jpg


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

DSC00030.jpg

  

[root@localhost sed]# 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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-555029-1-1.html 上篇帖子: shell脚本进阶。 下篇帖子: shell 脚本加密
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表