Linux Linux grep命令用法以及正則表達

一、grep命令和正則表達式的簡介

1、grep(Global search REgular expression and Print out the line),即全局搜索正則表達式並打印出匹配的行,它是Linux系統中一個強大的文本搜索工具,它根據用戶指定的“模式(pattern)”對目標文本進行過濾,顯示被模式匹配到的行;

2、正則表達式是由一類字符書寫的模式,其中有些字符不表示符的字面意義,而是表示控制或通配的功能


二、grep命令的基本語法格式

grep [OPTION]... 'PATTERN' FILE...
grep的常用選項:
  -v : 對匹配的行進行取反
  -o : 僅顯示匹配到的內容
  -i : 忽略字符大小寫
  -n : 爲匹配的行加上行號
  -E : 使用擴展正則表達式 ,等同於egrep命令
  -F : 不使用正則表達式搜索,等同於fgrep命令
  -A # : 連同匹配行的下#行一併顯示,#代表任意數字
  -B # : 連同匹配行的上#行一併顯示,#代表任意數字
  -C # : 連同匹配行的上下#行一併顯示,#代表任意數字
  --color=auto : 對匹配的內容以不同的顏色顯示


三、grep正則表達式的基本用法

基本正則表達式:

1、字符匹配

.:匹配任意單個字符

例如:匹配以r開頭,t結尾中間只隔了兩個字符的行
[root@localhost ~]# grep 'r..t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost ~]#


[]:匹配指定集合中的任意單個字符

常用的集合表示方法有:
  純數字:[[:digit:]]或[0-9]
  小寫字母:[[:lower:]]或[a-z]
  大寫字母:[[:upper:]]或[A-Z]
  大小寫字母:[[:alpha:]]或[a-zA-Z]
  數字加字母:[[:alnum:]]或[0-9a-zA-Z]
  空白字符:[[:space:]]
  標點符號:[[:punct:]]
例如:匹配包含數字0或2的行
[root@localhost ~]# grep '[02]' /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/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
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
[root@localhost ~]#


[^]:匹配指定集合外的任意單個字符

例如:匹配包含除1-9範圍之外的字符的行
[root@localhost ~]# grep '[^1-9]' /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
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
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
dbus:x:81:81:System message bus:/:/sbin/nologin
rtkit:x:498:499:RealtimeKit:/proc:/sbin/nologin
pulse:x:497:498:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
[root@localhost ~]#


2、次數匹配

* : 匹配其前面的字符出現任意次,0、1或多次的行

創建一個測試文本,包含有以下內容:
[root@localhost ~]# cat grep_test.txt
y->1line
xy->2line
xxy->3line
xxxy->4line
aby->5line

abcy->7line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[root@localhost ~]#
例如:匹配x字母出現任意次的行:
[root@localhost ~]# grep 'x*y' grep_test.txt 
y->1line
xy->2line
xxy->3line
xxxy->4line
aby->5line
abcy->7line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[root@localhost ~]#
注意:任意次,說明x可爲0次。。


\+:匹配其前面的字符出現1次或多次的行

例如:匹配x字符至少1次的行
[root@localhost ~]# grep 'x\+y' grep_test.txt 
xy->2line
xxy->3line
xxxy->4line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[root@localhost ~]#


\?:匹配其前面的字符出現0次或1次的行

例如:匹配x字母出現0次或1次的行
[root@localhost ~]# grep 'x\?y' grep_test.txt 
y->1line
xy->2line
xxy->3line
xxxy->4line
aby->5line
abcy->7line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[root@localhost ~]#


\{m\}:匹配其前面的字符出現m次的行

例如:匹配x字母出現2次的行
[root@localhost ~]# grep 'x\{2\}y' grep_test.txt 
xxy->3line
xxxy->4line
xxxy->9line
[root@localhost ~]#


\{m,n\}:匹配其前面的字符至少出現m次,至多出現n次的行,m和n表示一個範圍[m-n]

例如:匹配x字母至少出現1次,至多出現3次的行
[root@localhost ~]# grep 'x\{1,3\}y' grep_test.txt 
xy->2line
xxy->3line
xxxy->4line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[root@localhost ~]#


3、位置錨定

^ : 行首錨定

例如:匹配x字母出現在行首的行
[root@localhost ~]# grep '^x' grep_test.txt 
xy->2line
xxy->3line
xxxy->4line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[root@localhost ~]#


$ : 行尾錨定

例如:匹配e字母出現在行尾的行
[root@localhost ~]# grep 'e$' grep_test.txt 
y->1line
xy->2line
xxy->3line
xxxy->4line
aby->5line
abcy->7line
xxxy->9line
xy->10line
[root@localhost ~]#


^$ : 匹配空白行

例如:匹配空白的行
[root@localhost ~]# grep '^$' grep_test.txt 

[root@localhost ~]#
這個文件只有一行空白行...


\< : 詞首錨定

例如:精確匹配xy兩個字母在一個單詞的詞首的行
[root@localhost ~]# grep '\<xy' grep_test.txt 
xy->2line
xyxy->8linexyxy
xy->10line
[root@localhost ~]#


\> : 詞尾錨定

例如:精確匹配xy兩個字母在一個單詞的詞尾的行
[root@localhost ~]# grep 'xy\>' grep_test.txt 
xy->2line
xxy->3line
xxxy->4line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[root@localhost ~]#


\<\> : 匹配單詞

例如:匹配包含xy這個單詞的行
[root@localhost ~]# grep '\<xy\>' grep_test.txt 
xy->2line
xy->10line
[root@localhost ~]#


4、分組

\(\) : 對某字符串進行分組匹配

例如:匹配xy單詞出現0次或1次的行
[root@localhost ~]# grep '\(xy\)\?' grep_test.txt 
y->1line
xy->2line
xxy->3line
xxxy->4line
aby->5line

abcy->7line
xyxy->8linexyxy
xxxy->9line
xy->10line
xxx->11linexy
[root@localhost ~]#

後向引用:模式中,如果使用\(\)實現了分組,在某行文本的檢查中,如果\(\)的模式匹配到了某內容,此內容後面的模式中可以被引用;

對前面的分組進行引用的符號爲:\1 , \2 ,\3

模式自左而右,引用第#個左括號以及與其匹配右括號之間的模式匹配到的內容;

後向引用舉例:

新建一個文本文件,假設有如下內容:

[root@localhost ~]# cat grep.txt 
He like his lover.
He love his love.
He like his liker.
He like his like.
[root@localhost ~]#
例如:找出前後相同單詞的行:
[root@localhost ~]# grep '\(\<[[:alpha:]].*\>\).*\<\1\>' grep.txt 
He love his love.
He like his like.
[root@localhost ~]#


最後,正則表達式元字符總結:

   字符匹配:. ,[] ,[^]

   次數匹配:* ,\? ,\+ ,\{m\} ,\{m,n\}

   位置錨定:^ ,$ ,\< ,\> ,\<\>

   分組匹配:\(\)


四、egrep及擴展正則表達式:

egrep相當於grep -E,egrep可以直接使用擴展正則表達式,而grep需要加上選項-E;

擴展正則表達式的元字符:

   字符匹配:. ,[] ,[^]

   次數匹配:*,?,+,{m},{m,n},{m,},{0,n}

   位置錨定:^,$,\>,\<

   分組匹配:(),支持後向引用

   | : 匹配左側或右側符合條件的行,比如a|b,含有a或b的行都匹配;

例如:egrep等同於grep -E
[root@localhost ~]# grep -E 'k|i' grep.txt 
He like his lover.
He love his love.
He like his liker.
He like his like.
[root@localhost ~]# egrep 'k|i' grep.txt 
He like his lover.
He love his love.
He like his liker.
He like his like.
[root@localhost ~]#


五、grep練習題:

(1).顯示/proc/meminfo文件中以大寫或小寫s開頭的行;

# grep -i '^s' /proc/meminfo

(2).顯示/etc/passwd文件中其默認shell爲非/sbin/nologin的用戶;

# grep -v '/sbin/nologin$' /etc/passwd | cut -d: -f1

(3).顯示/etc/passwd文件中其默認shell爲/bin/bash的用戶

進一步:僅顯示上述結果中其ID號最大的用戶

# grep '/bin/bash$' /etc/passwd | cut -d: -f1 | sort -n -r | head -1

(4).找出/etc/passwd文件中的一位數或兩位數;

# grep '\<[[:digit:]]\{1,2\}\>' /etc/passwd

(5).顯示/boot/grub/grub.conf中至少一個空白字符開頭的行

# grep '^[[:space:]]\+.*' /boot/grub/grub.conf

(6).顯示/etc/rc.d/rc.sysinit文件中,以#開頭,後面跟至少一個空白字符,而後又有至少一個非空白字符的行;

# grep '^#[[:space:]]\+[^[:space:]]\+' /etc/rc.d/rc.sysinit

(7).找出netstat -tan命令執行結果中包含'LISTEN'的行;

# netstat -tan | grep 'LISTEN[[:space:]]*$

(8).添加用戶bash,testbash,basher,nologin(SHELL爲/sbin/nologin),而找出當前系統上其用戶名和默認SHELL相同的用戶;

# grep '\(\<[[:alnum:]]\+\>\).*\1$' /etc/passwd

(9).擴展題:新建一個文本文件,假設有如下內容:

He like his lover.

He love his lover.

He like his liker.

He love his liker.

找出其中最後一個單詞是由此前某單詞加r構成的行;

# grep '\(\<[[:alpha:]]\+\>\).*\1r' grep.txt

(10).顯示當前系統上root、centos或user1用戶的默認shell及用戶名;

# grep -E '^(root|centos|user1\>)' /etc/passwd

(11).找出/etc/rc.d/init.d/functions文件中某單詞後面跟一對小括號'()"的行;

# grep -o '\<[[:alpha:]]\+\>()' /etc/rc.d/init.d/functions

(12).使用echo輸出一個路徑,而使用egrep取出其基名;

# echo /etc/rc.d/ | grep -o '[^/]\+/\?$' | grep -o '[^/]\+'


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