grep工具

第九章 正則

9.1 正則介紹&grep(上)

正則

在計算機科學中,是指一個用來描述或者匹配一系列符合某個句法規則的字符串的單個字符串。在不少文本編輯器或其餘工具裏,正則表達式一般被用來檢索和/或替換那些符合某個模式的文本內容。許多程序設計語言都支持利用正則表達式進行字符串操做。linux

正則表達式的基礎  

在最簡單的狀況下,一個正則表達式看上去就是一個普通的查找串。如:正則表達式"test"中沒有包含任何元字符,它能夠匹配"test"和"007test007"等字符串,可是不能匹配"Test"。ios

要想真正的用好正則表達式,須要正確的理解元字符。正則表達式

元字符

. :匹配任何單個字符。例如正則表達式 r.t 匹配這些字符串:rat、rut、r t,可是不匹配root。bash

$ :匹配行結束符。例如正則表達式 weasel$ 可以匹配字符串"He's a weasel"的末尾,可是不能匹配字符串"They are a bunch of weasels."。編輯器

^ :匹配一行的開始。例如正則表達式 ^When in 可以匹配字符串"When in the course of human events"的開始,可是不能匹配"What and When in the"。工具

*:匹配0個或多個正好在它以前的那個字符。如,正則表達式 .* 意味着可以匹配任意數量的任何字符(表明全部內容)。spa

" \ ":脫義符,使這裏列出的這些元字符以普通的字符的身份來進行匹配。如,\ . 是匹配點字符,而不是以通配符的身份出現。命令行

[ ]:匹配括號中的任何一個字符。如,正則表達式 r[aeo]d 匹配rad,red,rod。也能夠指定區間 [0-9a-zA-Z],即表明全部非特殊字符!設計

\ <,\ >:匹配詞(word)的開始(\ <)和結束(\ >)。例如正則表達式 \ < the 可以匹配字符串"for the wise"中的"the",可是不能匹配字符串"otherwise"中的"the"。 注意: 這個元字符不是全部的軟件都支持的。code

|:將兩個匹配條件進行邏輯「或」(Or)運算。 注意: 這個元字符不是全部的軟件都支持的。

+:匹配1或多個正好在它以前的那個字符。注意: 這個元字符不是全部的軟件都支持的。

?:匹配0或1個正好在它以前的那個字符。注意: 這個元字符不是全部的軟件都支持的。

\ {i\ }\ {i,j\ }: 匹配指定數目的字符,這些字符是在它以前的表達式定義的。例如正則表達式A[0-9]\ {3\ } 可以匹配字符"A"後面跟着正好3個數字字符的串,例如A12三、A348等,可是不匹配A1234。而正則表達式[0-9]\ {4,6\ } 匹配連續的任意4個、5個或者6個數字字符。注意: 這個元字符不是全部的軟件都支持的。

正則表達式的語法支持狀況


注: x表示支持。

grep(上)

grep (縮寫來自Globally search a Regular Expression and Print)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。Unix的grep家族包括grep、egrep和fgrep,egrep和fgrep的命令都是grep的擴展,支持更多的re元字符,fgrep就是fixed grep或fast grep,它們把全部的字母都看做單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,再也不特殊。linux使用GNU版本的grep。它功能更強,能夠經過-G、-E、-F命令行選項來使用egrep和fgrep的功能。

語法: grep [options] ‘Word’ filename
Options:
-c:=count 行數
-i:=ignore-case 不區分大小寫
-n:=line-number 顯示行號
-v:=revert-match 取反
-r,-R:=recursive(遞歸的,循環的)讀取目錄下的全部文件,包括子目錄
-A:後面跟數字,過濾出複合要求的行以及下面n行
-B:同上,過濾出符合要求的行以及上面n行 -C:同上,同時過濾出符合要求的行以及上下各n行
-E:‘grep -E’ = egrep

eg:

  • 過濾一個字符串
[root@1 grep]# grep 'nologin' 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
[root@1 grep]# which grep
alias grep='grep --color=auto'
	/usr/bin/grep

 

  • grep -c
[root@1 grep]# grep -c 'nologin' passwd
4
[root@1 grep]# cat !$
cat 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  • grep -n
[root@1 grep]# grep -n 'nologin' passwd
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  • grep -i
[root@1 grep]# cat !$
cat 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@1 grep]# grep 'nologin' passwd
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

[root@1 grep]# grep -i 'nologin' 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

[root@1 grep]# grep -c 'nologin' passwd
3
[root@1 grep]# grep -ic 'nologin' passwd
4
  • grep -v
[root@1 grep]# grep -v 'nologin' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/Nologin
  • grep -r/R
[root@1 grep]# tree
.
├── grep1
│   └── passwd1
└── passwd
[root@1 grep]# grep -r 'root' .
./passwd:root:x:0:0:root:/root:/bin/bash
./grep1/passwd1:root:x:0:0:root:/root:/bin/bash

[root@1 grep]# grep -R 'root' .
./passwd:root:x:0:0:root:/root:/bin/bash
./grep1/passwd1:root:x:0:0:root:/root:/bin/bash
  • grep -A
[root@1 grep]# grep -nA2 'daemon' passwd
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4-adm:x:3:4:adm:/var/adm:/sbin/nologin
5-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  • grep -B
[root@1 grep]# grep -nB2 'daemon' passwd
1-root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/Nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
  • grep -C
[root@1 grep]# grep -nC2 'daemon' passwd
1-root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/Nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4-adm:x:3:4:adm:/var/adm:/sbin/nologin
5-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

9.2 grep(中)

grep應用

  • eg1:grep -n '[0-9]'
[root@1 grep]# grep -n '[0-9]' passwd
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/Nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
5:adm:x:3:4:adm:/var/adm:/sbin/nologin
6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7:pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin

 

  • eg2:grep -nv '[0-9]'
[root@1 grep]# cat !$
cat 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
Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/c
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

[root@1 grep]# grep -nv '[0-9]' passwd
4:Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/c
8:Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
  • grep -n ' ^# ' 過濾以#開頭的行(^在此表示以某字符開頭)
[root@1 grep]# cat inittab
# inittab is no longer used when using systemd.
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
lhugalkdoljweriii
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
jlkdghkhladlllsdjfj
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5

[root@1 grep]# grep -n '^#' inittab
1:# inittab is no longer used when using systemd.
2:# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
4:# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
6:# multi-user.target: analogous to runlevel 3
7:# graphical.target: analogous to runlevel 5

[root@1 grep]# grep -nv '^#' inittab  過濾不是以#開頭的行
3:lhugalkdoljweriii
5:jlkdghkhladlllsdjfj
  • grep '[^0-9]' 表示非0-9中任意字符所在的行,即任意非數字所在的行(只要包含非數字字符都算在內,中括號內的‘^’表示否認)
[root@1 grep]# cat inittab
# inittab is no longer used when using systemd.
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
lhugalkdoljweriii
23542524
1245a879869
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
6999%&*0927309
# multi-user.target: analogous to runlevel 3
^%^%$&%%*&##
# graphical.target: analogous to runlevel 5

[root@1 grep]# grep '[^0-9]' inittab
# inittab is no longer used when using systemd.
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
lhugalkdoljweriii
1245a879869
# systemd uses 'targets' instead of runlevels. By default, there are two main target:
6999%&*0927309
# multi-user.target: analogous to runlevel 3
^%^%$&%%*&##
# graphical.target: analogous to runlevel 5

 

  • grep '^[^0-9]' 表示以非數字字符開頭的行
[root@1 grep]# grep '^[^0-9]' inittab
# inittab is no longer used when using systemd.
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
lhugalkdoljweriii
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
# multi-user.target: analogous to runlevel 3
^%^%$&%%*&##
# graphical.target: analogous to runlevel 5

 

  • grep 'r.o' 在此‘.’表示一個任意字符
[root@1 grep]# grep 'r.o' passwd
root:x:0:0:roprot:/root:/bin/bash
pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin

 

  • grep 'o*o' 在此‘ * ’表示其左邊的字符重複n此(n≥0)
[root@1 grep]# grep 'o*o' 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
Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin

 

  • grep '.*' 在此' . * '組合表示全部任意字符
[root@1 grep]# grep '.*' passwd
root:x:0:0:roprot:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/Nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

 

  • grep 'o\ {2\ }' 在此{}表示前面字符或字符串出現的次數(也能夠是一個區間,如'o\ {0,3\ }'表示0個到3個o)
[root@1 grep]# grep -n 'o\{2\}' passwd
1:root:x:0:0:roprot:/root:/bin/bash
4:Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c
6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@1 grep]# grep -n 'o\{3\}' passwd
4:Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c

[root@1 grep]# grep -n 'o\{0,3\}' passwd
1:root:x:0:0:roprot:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/Nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c
5:adm:x:3:4:adm:/var/adm:/sbin/nologin
6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7:pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
8:Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

 

9.3 grep(下)

egrep應用

  • egrep 'o{2}'=grep -E 'o {2}' = grep 'o\ {2\ }'
[root@1 grep]# grep -nE 'o{2}' passwd
1:root:x:0:0:roprot:/root:/bin/bash
4:Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c
6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@1 grep]# egrep -n 'o{2}' passwd
1:root:x:0:0:roprot:/root:/bin/bash
4:Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c
6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
當{}前面是一個字符串時須要使用‘()’

 

  • egrep -n 'o+o' 在此‘+’表示其左邊的字符重複n此(n≥1,注意和*的區別)
[root@1 grep]# egrep -n 'o+o' passwd
1:root:x:0:0:roprot:/root:/bin/bash
4:Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c
6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

 

  • egrep -n 'o?t' 在此?表示其前面的字符出現0次或1次
[root@1 grep]# egrep -n 'o?t' passwd
1:root:x:0:0:roprot:/root:/bin/bash
4:Ctrl-Alt-Deoooleooote ios handled by /usr/lib/systemd/system/c
7:pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
8:Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

 

  • egrep -n 'root|nologin' 在此‘|’表示或者
[root@1 grep]# egrep -n 'root|nologin' passwd
1:root:x:0:0:roprot:/root:/bin/bash
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
5:adm:x:3:4:adm:/var/adm:/sbin/nologin
6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7:pcp:x:996:994:Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
  • grep -nE '(oo){2}' 在此()內的內容表示一個字符組合,即連續出現兩次‘oo’=‘oooo’字符串
[root@1 grep]# grep -nE '(oo){2}' passwd
4:Ctrl-Alt-Deoooleoooote ios handled by /usr/lib/systemd/system/c

 

擴展

過濾一個目錄下全部某類型文檔中含有某字符的行:

[root@1 ~]# grep -r --include="*.txt" 'root' ./sed/
./sed/test.txt:root:x:0:0:roprot:/root:/bin/bash

說明: 過濾./sed/目錄下全部.txt文件中含有字符串root的行。

相關文章
相關標籤/搜索