shell编程(四)| grep正则表达式

grep

一,grep概述

Global search regular expression and print out the line
全面搜索研究正则表达式并显示出来

grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模式”对目标文本进行匹配检查 , 打印匹配到的行由正则表达式或者字符及基本文本字符所编写的过滤条件确定

二,grep的基本用法和格式

grep root passwd         显示包含root的行
grep ^root passwd        显示以root开头的行
grep root$ passwd       显示以root结尾的行
grep -i root passwd       忽略大小写
grep -v root passwd       显示不包含匹配文本的所有行
grep -E "^root|ROOT$" passwd  -E表示扩展的正则表达式,以root开头或者以ROOT结尾的行

注意:正规的 grep 不支持扩展的正则表达式子 , 竖线是用于表示”或”的扩展正则表达式元字符 , 正规的 grep 无法识别,egrep 命令等同于‘grep -E


####像这样带|的就是明显的扩展的正则表达式,如果不加-E就没有输出


练习

找出root在位于中间的行

[html] view plain copy
  1. [root@100 mnt]# cat passwd   
  2. root:x:0:0:root:/root:/bin/bash  
  3. bin:x:1:1:bin:/bin:/sbin/nologin  
  4. daemon:x:2:2:daemon:/sbin:/sbin/nologin  
  5. sync:x:5:0:sync:/sbin:/bin/sync  
  6. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown  
  7. halt:x:7:0:halt:/sbin:/sbin/halt  
  8. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin  
  9. root:haha:root  
  10. root:test:haha  
  11. haha:root:test  
  12. haha:test:ROOT:test  
  13. [root@100 mnt]# grep -i root passwd | grep -v -i ^root | grep -v -i root$       >>>>>>两次反向过滤  
  14. haha:root:test  
  15. haha:test:ROOT:test  
  16. [root@100 mnt]# grep -i root passwd | grep -v -i -E "^root|root$"               >>>>>>这一条是把上面命令做了合并  
  17. haha:root:test  
  18. haha:test:ROOT:test  
  19. [root@100 mnt]# grep -v -i -E "^root|root$" passwd | grep -i root  
  20. haha:root:test  
  21. haha:test:ROOT:test  

三,grep中的正则表达式

grep 'r..t' test      表示匹配r开头,t结尾的,中间含有两个任意字符的行,有几个.就匹配多少个

grep -E 'r*t' test    表示显示以r开始,t结尾,中间含有0到任意个r的行

grep -E 'ro*t'  test  表示显示以ro开始,t结尾,中间含有0到任意个o的行,这里*表示匹配0到任意多个*前面的字符

######注意:一定要加-E否则结果不对

grep -E 'ro?t' test    表示显示以ro开头,t结尾的,中间含有0或者1个字符的行

grep -E 'ro{1,}t' test          表示显示以ro开头, t结尾,中间含有1到多个任意字符的行

grep -E 'ro{1,3}t' test         表示显示以ro开头,t结尾,中间含有1到3个任意字符的行

grep -E 'ro{,3}' test     表示显示以ro开头,t结尾,中间含有0到3个任意字符的行

grep -E 'ro{3,}t' test     表示显示以ro开头,t结尾的,中间含有3到无穷任意字符的行

grep -E 'ro+t' test    表示显示以ro开头,t结尾的,中间含有1到无穷多个任意字符的行

这与grep -E 'ro{1,}t' test 的效果一样

grep -E '(root){1,}' test       表示匹配以root开头的,含有1到无穷多个root的行

########这里root被括起来,表示一个整体!!!

grep -E 'r.*t' test     表示以r开始t结尾中间含有0到任意个任意字符的行

#####r.*t匹配的是.    r*t匹配的是r

grep -E "r..\>" test   表示显示含有r(不一定是r开头),后面只匹配两个任意字符的行,\>表示防止向后扩展,有几个..就匹配几个任意字符

grep -E "\<..t" test   表示显示前面两个是任意字符,后面以t结尾的行,\<表示防止向前扩张,有几个.前面就匹配几个任意字符


练习

1,显示ip地址

[html] view plain copy
  1. [root@100 mnt]# ifconfig eth0 | grep -E "inet\>"  | cut -d " " -f 10        >>>>>  \>是直接显示inet,不扩展  
  2. 172.25.254.100  
[html] view plain copy
  1. [root@100 mnt]# ifconfig eth0 | grep -E "inet "  | cut -d " " -f 10         >>>>>  这里在inet后面添加了空格,相当于直接搜索inet空格 ,也可以时先精确查找  
  2. 172.25.254.100  

2,显示可以登陆系统的用户

[html] view plain copy
  1. [root@100 mnt]# cat /etc/shells                              >>>>>>查看系统用户可以使用的shell  
  2. /bin/sh  
  3. /bin/bash  
  4. /sbin/nologin  
  5. /usr/bin/sh  
  6. /usr/bin/bash  
  7. /usr/sbin/nologin  
  8. /bin/tcsh  
  9. /bin/csh  
  10. [root@100 mnt]# grep -v nologin /etc/shells                  >>>>>显示用户可以登陆系统的shell  
  11. /bin/sh  
  12. /bin/bash  
  13. /usr/bin/sh  
  14. /usr/bin/bash  
  15. /bin/tcsh  
  16. /bin/csh  
  17. [root@100 mnt]# echo `grep -v nologin /etc/shells`           >>>>>echo可以把多行显示为一行,这里显示为一行的目的是为了后面替换为|进行grep的与操作  
  18. /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/tcsh /bin/csh  
  19. [root@100 mnt]# echo `grep -v nologin /etc/shells` | sed 's/ /|/g'   >>>>全局替换 把空格换为| 方便grep的与操作  
  20. /bin/sh|/bin/bash|/usr/bin/sh|/usr/bin/bash|/bin/tcsh|/bin/csh  
  21. [root@100 mnt]# vim user_check.sh  
  22. [root@100 mnt]# cat user_check.sh  
  23. #################################  
  24. # Author:           Minz        #  
  25. # Version:                      #  
  26. # Mail:           [email protected] #  
  27. # Date:        2018-06-17       #  
  28. # Description                   #  
  29. #                               #  
  30. #################################  
  31.   
  32. #!/bin/bash  
  33. SHELL=$(echo `grep -v nologin /etc/shells` | sed 's/ /|/g')  
  34. grep -E "$SHELL" /etc/passwd | cut -d : -f 1  管道符前面找出可以登陆用户的行,后面截取用户列  
  35.   
  36. 测试  
  37. [root@100 mnt]# sh user_check.sh   
  38. root  
  39. student  
  40. hh  
  41. hehe  
  42. nihao  
  43. [root@100 mnt]# useradd -s /bin/tcsh user1        tcsh也可以登陆shell  
  44. [root@100 mnt]# sh user_check.sh   
  45. root  
  46. student  
  47. hh  
  48. hehe  
  49. nihao  
  50. user1  
  51. [root@100 mnt]# useradd -s /bin/nologin user2  
  52. [root@100 mnt]# sh user_check.sh   
  53. root  
  54. student  
  55. hh  
  56. hehe  
  57. nihao  
  58. user1 
成功!!!!

猜你喜欢

转载自blog.csdn.net/ha_weii/article/details/80737599