linux三劍客之 —— grep命令詳解,超詳細!



- Linux上下文處理三劍客

  • grep:文本過濾(模式、pattern)工具

grep家族成員有:grep、egrep、fgrep

  1. fgrep 該命令不匹配任何正則表達式引擎,所以該命令與其他兩個命令相比,其耗費的系統資源更少。
  2. egrep 該命令支持擴展正則表達式引擎
  3. grep 默認使用基本正則表達式引擎去匹配文本
  • sed:stream editor,文本編輯工具
  • awk:Linux上的實現gawk,文本報告生成器

- grep命令的基本介紹

  • grep的全名:Global search Regular expression and print out the line.
  • 作用:文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查:打印匹配到的行
  • 模式:由正則表達式字符及文本字符所編寫的過濾條件
  • REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些字符不表示字符字面意義,而表示控制或通配的功能
  • 正則表達式的分類:
    • 基本正則表達式,BRE
    • 擴展正則表達式,ERE

grep -E 基本等同於 egrep


- 正則表達式引擎:

  • grep命令的基本格式:

grep [OPTIONS] PATTERN [FILE…]

  • grep命令的參數選項:
  1. –color=auto 給匹配到的字符串作色

  2. -v:顯示不能夠被pattern匹配到的行

  3. -E:使用擴展正則表達式,使用ERE

  4. -G:使用基本正則表達式

  5. -F:基本字符串

  6. -P:perl 表達式

  7. -i:匹配時忽略字符大小寫

[xiao@dayuanshuai ~]$ grep -i RoOT /etc/passwd  #不區分大小寫,所以匹配到root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
  1. -o:僅顯示匹配到的字符本身

  2. -q:靜默模式,檢查匹配後,不向屏幕輸出任何信息

  3. -A # : after,顯示匹配到的行,及其行後多行。

[xiao@dayuanshuai ~]$ grep -A 2 root /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
  1. -B #:before,顯示匹配到的行,及其行前多行
[xiao@dayuanshuai ~]$ grep -B 2 root /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
  1. -C #:context,顯示匹配到的行,及其前後多行
[xiao@dayuanshuai ~]$ grep -C 2 root /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

- 基本正則表達式元字符:

  • 字符匹配
    • . :匹配任意單個字符
    • []: 匹配指定範圍內的任意單個字符
    • [^]:匹配指定範圍外的任意單個字符
      • [:digit:] 匹配數字
      • [:lower:] 匹配小寫字母
      • [:upper:] 匹配大寫字母
      • [:alpha:] 匹配字母
      • [:alnum:] 匹配字母和數字
      • [:punct:] 匹配任何標點符號
      • [:space:] 匹配空白字符
  • 匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數
    • *:匹配前面的字符任意次
[xiao@dayuanshuai ~]$ cat b.txt #查看b.txt的內容
abxy
xay
xxxxxxxy
[xiao@dayuanshuai ~]$ grep "x*y" b.txt #查看匹配結果
abxy
xay
xxxxxxxy
  • 貪婪模式
    • grep 匹配文本時默認處於貪婪模式,即近可能在符合條件的情況下匹配最多的字符串
[xiao@dayuanshuai ~]$ cat grep_big.txt 
more more more
more
[xiao@dayuanshuai ~]$ grep --color "m.*e" grep_big.txt   #grep按照最大長度進行匹配
more more more
more
  • .*:任意長度任意字符
  • ?:匹配其前面的字符0或1:即前面的字符可有可無
[xiao@dayuanshuai ~]$ cat b.txt 
abxy
xay
xxxxxxxy
[xiao@dayuanshuai ~]$ grep --color "x\?y" b.txt 
abxy
xay
xxxxxxxy
  • \+:匹配其前面的字符至少1次
[xiao@dayuanshuai ~]$ cat b.txt 
abxy
xay
xxxxxxxy
[xiao@dayuanshuai ~]$ grep --color "x\+y" b.txt 
abxy
xxxxxxxy
  • \{m\} : 匹配前面的字符m次
[xiao@dayuanshuai ~]$ grep "[[:alpha:]]\{3\}t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  • \{m,n\}:匹配前面的字符至少m次,至多n次
[xiao@dayuanshuai ~]$ grep --color "[[:alpha:]]\{1,3\}t" /etc/passwd #匹配前面的字母最少一次,最多三次
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  • {0,n}:匹配前面的字符至多n次
[xiao@dayuanshuai ~]$ grep --color "[[:alpha:]]\{0,3\}dy" /etc/passwd  #在dy前匹配字母最多三次
nobody:x:99:99:Nobody:/:/sbin/nologin
  • {m,}:匹配前面的字符至少m次
[xiao@dayuanshuai ~]$ grep --color "[[:alpha:]]\{4,\}y" /etc/passwd  #匹配y前面的字母最少4次    
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

- 位置錨定

  • ^ : 行首錨定:用於模式的最左側
[xiao@dayuanshuai ~]$ grep "^s" /etc/passwd  #在/etc/passwd中查找開頭以s開頭的行
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  • $:行尾錨定:用於模式的最右側
[xiao@dayuanshuai ~]$ grep "c$" /etc/passwd  #在/etc/passwd中查找以c結尾的行
sync:x:5:0:sync:/sbin:/bin/sync
  • ^PATTERN$: 用於模式匹配整行
[xiao@dayuanshuai ~]$ cat b.txt 
abxy
aaabxy
xay
xayyy
xayss
xxxxxxxy
xxxxxxxysss
[xiao@dayuanshuai ~]$ grep "^xay$" b.txt  在b.txt 中查找有一行是xay的行
xay

^$: 空行

^[[:space:]]*$

  • \< 或 \b:詞首錨定:用於單詞模式的左側
[xiao@dayuanshuai ~]$ grep '\<[[:alpha:]]\{1,3\}t' /etc/passwd #匹配詞首爲1個到3個字母開頭後接t的行
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
  • \> 或 \b:詞尾錨定:用於單詞模式的右側
[xiao@dayuanshuai ~]$ grep '[[:alpha:]]\{1,3\}t\>' /etc/passwd   # 匹配以t結尾前面有一到三個字母的單詞
root:x:0:0:root:/root:/bin/bash
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
  • \<PATTERN\> : 匹配整個單詞:
[xiao@dayuanshuai ~]$ grep '\<[[:alpha:]]\{1,3\}t\>' /etc/passwd  
root:x:0:0:root:/root:/bin/bash
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin

-分組:

  • \(\) : 將一個或多個字符捆綁在一起,當作一個整體進行處理
[xiao@dayuanshuai ~]$ grep --color "\(xy\)\+" b.txt 
abxy
aaabxy
xxxxxxxy
xxxxxxxysss
[xiao@dayuanshuai ~]$ grep --color "\(xy\)*s" b.txt   
xayss
xxxxxxxysss
  • Note: 分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式爲: \1, \2, \3, …
    • \1: 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
    • 例子: \(ab\+\(xy\)*\)
      • \1:ab\+\(xy\)*
      • \2:xy
  • 後向引用:引用前面分組括號中的模式所匹配字符,(而非模式本身)
[xiao@dayuanshuai ~]$ grep --color "\(xy\)*.*\1" b.txt 
xyaaabxy
xyxxxxxxy

- 習題:

  1. 顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式)
[xiao@dayuanshuai ~]$  grep -i  "^s" /proc/meminfo
SwapCached:            0 kB
SwapTotal:       3145724 kB
SwapFree:        3145724 kB
Shmem:               228 kB
Slab:             150788 kB
SReclaimable:      87644 kB
SUnreclaim:        63144 kB
[xiao@dayuanshuai ~]$ grep '^[sS]' /proc/meminfo   
SwapCached:            0 kB
SwapTotal:       3145724 kB
SwapFree:        3145724 kB
Shmem:               228 kB
Slab:             150780 kB
SReclaimable:      87640 kB
SUnreclaim:        63140 kB
  1. 顯示/etc/passwd文件中不以/bin/bash結尾的行
[xiao@dayuanshuai ~]$ grep -v '/bin/bash$' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dhcpd:x:177:177:DHCP server:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
  1. 顯示/etc/passwd文件中ID號最大的用戶的用戶名
[xiao@dayuanshuai ~]$ sort -t: -k3 -n /etc/passwd |tail -1 |cut -d: -f1
xiao
  1. 如果用戶root存在,顯示其默認的shell程序
[xiao@dayuanshuai ~]$ id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7 
/bin/bash
  1. 找出/etc/passwd中的兩位或三位數
[xiao@dayuanshuai ~]$ grep -o '\<[0-9]\{2,3\}\>' /etc/passwd  
12
10
14
11
12
100
13
30
14
50
99
99
...
  1. 顯示/etc/grub.conf 文件中,至少以一個空白字符開頭的且後面存在非空白字符的行
[root@dayuanshuai ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub.conf 
        root (hd0,0)
        kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=UUID=7babbd31-9dc4-48a4-a532-9c3c5239d36e rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-754.el6.x86_64.img
  1. 找出"netstat -tan"命令的結果中以’LISTEN’後跟0、1或多個空白字符結尾的行
[root@dayuanshuai ~]# netstat -tan | grep "LISTEN[[:space:]]\{0,\}$"  
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0      0 ::1:25                      :::*                        LISTEN   
[root@dayuanshuai ~]# netstat -tan | grep "LISTEN[[:space:]]*$" 
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0      0 ::1:25                      :::*                        LISTEN   
  1. 添加用戶bash、testbash、basher以及nologin(其shell爲/sbin/nologin);而後找出/etc/passwd文件中用戶名同shell名的行
[root@dayuanshuai ~]# grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd     
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
  1. 寫一個腳本,實現如下功能
  • 如果user1用戶存在,就顯示其存在,否則添加之
  • 顯示添加的用戶的id號等信息
#!/bin/bash
id user1 &>/dev/null && echo "user1 exists." || useradd user1
id user1

10.寫一個腳本,完成如下功能

  • 如果root用戶登錄了當前系統,就顯示root用戶在線;否則說明其未登錄
[root@dayuanshuai ~]# w | grep "root\>" &>/dev/null && echo "root logged" || echo "root not logged"
root logged



- 寫在最後的話:

  • 無論每個知識點的難易程度如何,我都會盡力將它描繪得足夠細緻
  • 歡迎關注我的CSDN博客,IDYS’BLOG
  • 持續更新內容運維 | 網工 | 軟件技巧
  • 如果你有什麼疑問,或者是難題。歡迎評論或者私信我。你若留言,我必回覆!
  • 雖然我現在還很渺小,但我會做好每一篇內容。謝謝關注!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章