Grep學習筆記

一、Grep是什麼

Grep是一種文本過濾工具, 全稱是Global search regular expression and print out the line, 其工作方式是根據用戶給定的模式(由正則表達式字符及文本字符所編寫的過濾條件)對目標文件逐行進行匹配檢查, 默認打印匹配到的行

1.1 正則表達式Regular Expression

Regular Expression是一類由特殊字符及文本字符所編寫的模式(Pattern), 其中的一些字符並不表示字符本身的意義, 而表示控制或者通配功能.
Grep支持的正則表達式有兩種:

  • BRE: 基本正則表達式, grep
  • ERE: 擴展正則表達式, grep -E or egrep

1.2 用法

# 用法: grep [options] pattern [file]

# 此博客只介紹一些常用選項, 更多選項請查看man文檔
# --color=auto: 對匹配的文本用顏色顯示, CentOS 7已默認在別名中加入
[root@zabbix ~]# alias
alias grep='grep --color=auto'

# -v: 顯示不能夠被pattern匹配到的行
[root@zabbix ~]# grep Kernel /etc/issue 
Kernel \r on an \m
[root@zabbix ~]# grep -v Kernel /etc/issue
\S

# -i: 匹配時忽略字符大小寫
[root@zabbix ~]# grep -i ROOT /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

# -o: 僅顯示匹配到的字符串
[root@zabbix ~]# grep -o root /etc/passwd
root
root
root
root

# -q: 靜默模式, 不輸出任何信息, 可用echo $?查看執行結果
[root@zabbix ~]# grep -q root /etc/passwd 
[root@zabbix ~]# echo $?
0

# -A num: 顯示匹配到的行及行後面的num行
[root@zabbix ~]# grep -A 2 user1 /etc/passwd
user1:x:1000:1000::/home/user1:/bin/bash
user2:x:2000:2000::/home/user2:/bin/bash
user3:x:2001:2001::/home/user3:/bin/bash

# -B num: 顯示匹配到的行及行前面的num行
[root@zabbix ~]# grep -B 2 user1 /etc/passwd 
chrony:x:996:994::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
user1:x:1000:1000::/home/user1:/bin/bash

# -C num: 顯示匹配到的行及前後的num行
[root@zabbix ~]# grep -C 2 user1 /etc/passwd 
chrony:x:996:994::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
user1:x:1000:1000::/home/user1:/bin/bash
user2:x:2000:2000::/home/user2:/bin/bash
user3:x:2001:2001::/home/user3:/bin/bash

# -E: 使用擴展的正則表達式

二、基本正則表達式元字符

2.1 字符匹配

  • .(點號): 匹配任意單個字符
[root@zabbix ~]# grep -o r..t /etc/passwd 
root
root
root
root
r/ft
  • []: 匹配指定範圍內的仍以單個字符, 支持:
[root@zabbix ~]# grep -o [a-z][a-z][a-z][0-9] /etc/passwd
ser1
ser1
ser2
...  # 此處省略

[root@zabbix ~]# grep -o [[:lower:]][[:lower:]][[:lower:]] /etc/passwd
bin
bin
bin
bin
... # 此處省略

2.2 匹配次數

  • *: 匹配前面的字符任意次(0~N)
[root@zabbix ~]# grep -o o*t /etc/passwd
oot
oot
oot
t
...
  • .*: 匹配任意長度的任意字符
[root@zabbix ~]# grep -o r.*t /etc/passwd
root:x:0:0:root:/root
rator:x:11:0:operator:/root
r:/var/ft
r/lib/avahi-aut
...
  • \?: 匹配前面的字符0次或者1次
[root@zabbix ~]# grep -o 'r[[:lower:]]\?t' /etc/passwd
rat
rat
rat
  • +: 匹配前面的字符至少1次, 多則不限
[root@zabbix ~]# grep -o 'r[[:lower:]]\+t' /etc/passwd 
root
root
root
rat
rat
root
rat
  • \{m\}: 匹配前面的字符至少m次
[root@zabbix ~]# grep -o 'u[[:lower:]]\{3\}[[:digit:]]' /etc/passwd
user1
user1
user2
...
  • \{m,n\}: 匹配前面的字符至少m次, 至多n次
    • \{m,\}: 匹配前面的字符至少m次, 至多不限
[root@zabbix ~]# grep -o 'u.\{2,3\}[[:lower:]]' /etc/passwd 
utdow
utdow
utdow
usr/g
...

[root@zabbix ~]# grep -o 'u.\{2,\}[[:lower:]]' /etc/passwd 
utdown:x:6:0:shutdown:/sbin:/sbin/shutdown
usr/games:/sbin/nologin
utoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
us-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
us:x:81:81:System message bus:/:/sbin/nologin
unt used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
user1:x:1000:1000::/home/user1:/bin/bash
...

Note: 默認情況下, 正則表達式工作於貪婪模式, 會儘可能的多的去匹配模式

2.3 位置錨定

  • ^: 行首錨定
[root@zabbix ~]# grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash
  • $: 行尾錨定
[root@zabbix ~]# grep bash$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
user1:x:1000:1000::/home/user1:/bin/bash
user2:x:2000:2000::/home/user2:/bin/bash
...
  • ^PATTERN$: 匹配整行
    • ^$: 匹配空行
    • ^[:space:]$: 匹配全是空白字符的行
[root@zabbix ~]# grep '^r.\+[[:lower:]]$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
  • \< or \b: 詞首錨定, 用於單詞模式的左側
[root@zabbix ~]# grep '\broot' /etc/passwd
root:x:0:0:root:/root:/bin/bash
  • \> or \b: 詞尾錨定, 用於單詞模式的右側
[root@zabbix ~]# grep 'bash\b' /etc/passwd      
root:x:0:0:root:/root:/bin/bash
user1:x:1000:1000::/home/user1:/bin/bash
user2:x:2000:2000::/home/user2:/bin/bash
user3:x:2001:2001::/home/user3:/bin/bash
...
  • \< pattern\> or \bPATTERN\b: 匹配整個單詞
[root@zabbix ~]# grep '\broot\b' /etc/passwd       
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

2.4 分組

  • \(\): 將任意個字符捆綁在一起, 當做一個整體
    • 後向引用: 引用前面分組括號中的模式所匹配字符, 而非模式本身

Note: 分組括號中的模式匹配到的內容會被正則表達式引擎記錄在內部的變量中, 這些變量的命名方式爲\1, \2, \3, ...

  • \1: 從左側起, 第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符, 例: \(ab+\(\xy)*\), 因此“\1”匹配到的是: ab\+\(xy\)*; “\2”匹配到的是: xy
[root@zabbix ~]# grep '\([[:lower:]]\{1\}\)\1' /etc/passwd 
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
zabbix:x:994:989:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin

[root@zabbix ~]# grep -o '\([[:lower:]]\{1\}\)\1' /etc/passwd 
oo
oo
oo
oo
oo
oo
ss
ss
cc
ll
oo
ss
ss
tt
bb
bb
bb

以上就是我學習grep的筆記.

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