shell程式設計(四)| grep正規表示式

Minza發表於2018-06-21

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在位於中間的行

  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地址

  1. [root@100 mnt]# ifconfig eth0 | grep -E "inet\>"  | cut -d " " -f 10        >>>>>  \>是直接顯示inet,不擴充套件  
  2. 172.25.254.100  
  1. [root@100 mnt]# ifconfig eth0 | grep -E "inet "  | cut -d " " -f 10         >>>>>  這裡在inet後面新增了空格,相當於直接搜尋inet空格 ,也可以時先精確查詢  
  2. 172.25.254.100  

2,顯示可以登陸系統的使用者

  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:           zmxxx@163.com #  
  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 
成功!!!!

相關文章