天天看點

Grep指令

regexp:元字元

basic regexp:基本正規表達式

extended regexp:擴充正規表達式

grep: Global Research Regular Expression and Printing

grep

egrep  

fgrep

使用方法:grep [option] PATTERN file1……

basic regexp:基本正規表達式的元字元

.比對任意單個字元

grep 'r..t'  /etc/passwd

*比對其前面的字元任意次 包括0次

grep "r[a-z]*t"  /etcpasswd比對 以r開頭t結尾 中間包含a-z任意次數的  

grep 'ab*c' (開頭必須是a 内容理由有c,b可以出現一次多次,或不出現,)

.*任意長度的任意字元

grep 'r.*t' /etc/passwd  貪婪模式  能比對多長就比對多長 直到最後一個

[]指定範圍内的任意單個字元;隻能有一個字元

[abc],[aA],[Cc]at,[a-z]

[^ab] 除了ab之外的任意單個字元

[^] 取反

也可以支援指定字元集

[:upper:] 大寫字母

[:lower:] 小寫字母

[:digit:]  數字

[:alpha:] 所有字母

[:alnum:] 字母數字

[:space:] 空字元,tab和space

[:punct:] 标點符号

使用方法[[:upper:]]  取反 [^[:upper:]]

?比對相面的字元0次或1次

ab?c  

abc  abbc  ac abbc肯定不行,因為隻可以出現1次或0次

X\{m,n\}  X字元至少出現m次  至多出現n次

X\{m,\}   至少出現m次,至多不限

X\{0,n\}   至多出現n次,至少不限

使用方法grep "[[:space:]]\{1,\}" test

注意:

grep "[[:space:]]\{1,\}" test

grep "[^[:space:]]\{1,\}" test

兩者在文本中沒有全空行的情況下效果一樣,因為取反隻是取非全空行,就字元就滿足

錨定符

^行首錨定

grep "^r..t" /etc/passwd

$行尾錨定

^$空白行錨定

grep "^$" test

單詞錨定符号(單詞連續的字母,不包含特殊字元)

\<詞首錨定 或  \b

grep "\<r..t" /etc/passwd

grep "\br..t" /etc/passwd

\>詞尾錨定 或  \b

grep "r..t\>" /etc/passwd

grep "r..t\b" /etc/passwd

\<\>精确比對 或 \b\b

grep "\<r..t\>" /etc/passwd

grep "\br..t\b" /etc/passwd

\(\)後向引用(前面是某個單詞,後面是某個單詞+x)

grep "\(l..e\).*\1r" text  截取包含以l..e開頭後面任意字元直到相同l..e後加r的行

Grep選項

-v對結果取反

-i忽略字母大小寫

-o僅顯示比對到字元串

-E支援擴充正規表達式

-A顯示比對行以及該行之後的行    + num 行号

-B之前

-C上下文

\(\) --> ()

\{\} --> ()

+次數比對,比對其前的字元至少1次

|或者 {C|c}  Cat or cat

 C|cat  C  or cat

小練習

1、查找目前系統上名字為user1使用者賬号的相關資訊在/etc/passwd,包含user11、myuser1

grep "^\buser1\b" /etc/passwd    考慮屬組,錨定行首

查找形如user*這樣的使用者賬戶資訊

grep "^user[0-9]\{1,\}\b" /etc/passwd

2、查找目前系統上以其為附加組的使用者有兩個或兩個以上的組的相關資訊,/etc/group

grep "," /etc/group   附加組必然有逗号

grep "," /etc/group | cut -d: -f1隻顯示這樣組的組名

3、查找目前系統上其使用者賬号密碼最長使用期為99999天的使用者賬戶的相關資訊

思路先确定最長使用時間的位置:

使用者名:密碼:最後修改時間:2次修最少改間隔:2次改最大間隔:警告:閑置:過期:保留

4、分析/etc/inittab檔案中如下兩行的文本特征,寫出可以精确找到類似兩行的模式.

形如:l2:2:wait:/etc/rc.d/rc 2

l3:3:wait:/etc/rc.d/rc 3

思路:切片num,引用num

grep "^l\(.\):\1:.*\1$" /etc/inittab

grep "^l\([0-9]\{1,\}\):\1:.*\1$" /etc/inittab

5、顯示/proc/meminfo檔案中不區分大小寫的s開頭的行

grep "^[Ss]" /proc/meminfo

6、顯示/etc/passwd中以nologin結尾的行

grep "nologin$" /etc/passwd

7、顯示/etc/inittab中以#開頭,且後跟一個或者多個空白字元串,而後跟任意非空白字元

grep "^#[[:space:]]\{1,\}[^[:space:]]*" /etc/inittab

8、顯示/etc/inittab 中包含了 :num:  兩個冒号中間一個數字的行

grep ":[0-9]:" /etc/inittab

9、顯示/boot/grub/grub.conf檔案中以一個或多個空白字元開頭的行

grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf

10、顯示/etc/inittab檔案中以一個數字開頭并以一個與開頭數字相同的數字結尾的行

grep "^\([0-9]\).*\1$" /etc/inittab

11、顯示出/etc/inittab中非空白的行

grep -v "^$" /etc/inittab

12、取出目前系統上以eth開頭的網絡裝置的IP位址

ifconfig | grep -A 1 'eth' | grep -o "addr:[0-9.]\{1,\}" | cut -d: -f2

13、查詢ifconfig中1位或者2位數字的行

ifconfig | grep -E "\b([1-9]|[1-9][0-9])\b"

本文轉自 ftmoonfans  51CTO部落格,原文連結:http://blog.51cto.com/soulboy/1224213

繼續閱讀