Posted on 2009-10-13 17:05
Prayer 閱讀(539)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Shell
grep的功能
grep從一個(gè)或多個(gè)文本文件中查找符合指定范本(正則表達(dá)式)的行,并把查找結(jié)果輸出到指定設(shè)備(默認(rèn)到屏幕)。
語(yǔ)法:
/usr/bin/grep [選項(xiàng)] <范本(正則表達(dá)式)> [文件1 ...]
范本是一個(gè)單獨(dú)的詞或者是一個(gè)用引號(hào)括起來(lái)的字符串。如果范本包含空格,則范本要用引號(hào)括起來(lái)。grep默認(rèn)下把結(jié)果輸出到屏幕但是并不影響或改變?nèi)魏伪徊檎业哪繕?biāo)文件。
一些特殊字符($, *, [, ^, |, (, ), 和\)的使用要特別小心,因?yàn)檫@些字符在shell里有特殊意義。如果這些字符作為范本的一部份,請(qǐng)用單引號(hào)把整個(gè)范式括起來(lái)。
# grep root /etc/passwd /etc/shadow /etc/passwd:root:x:0:0:Super-User:/:/sbin/sh /etc/shadow:root:PdhpgiTZvqa2:13732::::::
備注:黑體部分是文件名
|
grep命令的輸入
grep有三種輸入來(lái)源:標(biāo)準(zhǔn)輸入(鍵盤(pán))、管道和文件。如果你忘了輸入目標(biāo)文件,grep會(huì)假定從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤(pán))取得輸入,直到你按^D(Control+D)。如果是管道,上個(gè)命令的輸出將被作為grep的輸入被處理,并把查找結(jié)果輸出到指定輸出設(shè)備。
global$grep mypattern hello grep I forget input file(s) ^D global$
global$ ps -ef | grep root
global$ grep root /etc/passwd /etc/shadow
|
grep命令的返回值(不是查找結(jié)果)
### 0 (范本在指定文件里被查找到。) global$grep root /etc/passwd;echo $? root:x:0:0:Super-User:/:/sbin/sh 0
### 1 (范本在指定文件里沒(méi)有查找到) global$grep roo1t /etc/passwd;echo $? 1
### 2 (指定的目標(biāo)文件不存在) global$grep root /etc/passwd1;echo $? grep: can't open /etc/passwd1 2
備注:Bourn/Korn shell變量,?,返回最后被執(zhí)行的命令的返回值;C shell變量是status。
|
grep命令的選項(xiàng)
選項(xiàng)
|
描述
|
-c
|
顯示符合范本的行的數(shù)目而不是顯示滿足條件的行的內(nèi)容
|
-h
|
不顯示文件名
|
-i
|
忽略大小寫(xiě)
|
-l
|
只列出有滿足條件的行的文件的文件名
|
-n
|
顯示滿足條件的行在包含它的文件中的行號(hào)
|
-s
|
隱形操作,即如果出錯(cuò)不輸出任何信息。在用于只檢返回值時(shí)非常有用。
|
-v
|
反向顯示,即輸出不滿足條件的行。
|
grep的正則表達(dá)式的元字符
元字符
|
功能
|
列子
|
描述
|
^
|
行首
|
'^love'
|
匹配所有以love開(kāi)始的行
|
$
|
行尾
|
'love$'
|
匹配所有以love結(jié)尾的行
|
.(點(diǎn))
|
匹配任意一個(gè)字符
|
'l..e'
|
匹配所有包含l,緊跟任意2個(gè)字符,再跟一個(gè)e的行
|
*
|
匹配0個(gè)或多個(gè)字符
|
' *love'
|
匹配所有包含0個(gè)或多個(gè)空格,再跟love的行
|
[]
|
匹配一個(gè)在集合里的字符
|
'[Ll]ove'
|
匹配包含Love或love的行
|
[^]
|
匹配一個(gè)不在集合里的字符
|
'[^A-K]ove'
|
匹配不包含從A-K的字符,緊跟ove的行
|
\<
|
詞首
|
'\<love'
|
匹配所有有任一單詞以love為首的行
|
\>
|
詞尾
|
'love\>'
|
匹配所有有任一單詞以love為尾的行 |
\(..\)
|
標(biāo)識(shí)匹配的一個(gè)或多個(gè)字符
|
'\(love\)ing'
|
標(biāo)識(shí)一個(gè)標(biāo)注以期后面引用,第一個(gè)用\1,一次類推,最多有9個(gè);見(jiàn)列子
|
x\{m\} x\{m,\} x\{m,n\}
|
重復(fù)字符x:m次 至少m次 在m次到n次之間
|
'0\{5\}' '0\{5,\}' '0\{5,10\}
|
如果一個(gè)行有:連續(xù)5個(gè)0,至少連續(xù)5個(gè)0,連續(xù)的0在5到10之間,則滿足要求。
|
例子
- 查找在/etc下以p為首的文件中有那些行包含有root
# 、/usr/bin/grep root /etc/p* /etc/passwd:root:x:0:0:Super-User:/:/sbin/sh /etc/project:user.root:1::::
|
$ /usr/bin/grep . $HOME.profile
$ /usr/bin/grep ^$ /etc/passwd | wc -l (本命令統(tǒng)計(jì)/etc/passwd里有幾行空行)
|
- 輸出/etc/passwd中包含root或者sys的行
$/usr/xpg4/bin/grep -e 'root' -e 'sys' /etc/passwd 或者 $/usr/xpg4/bin/grep -E 'root|sys' /etc/passwd root:x:0:0:Super-User:/:/sbin/sh sys:x:3:3::/:
|
- 輸出所有行,此行包含這樣的一個(gè)單詞,它以小寫(xiě)字母打頭,緊跟任意個(gè)字符,以n結(jié)尾
$ grep '\<[a-z].*n\>' /etc/passwd (注意.*,它表示任意個(gè)字符,包括空格)
|
- 輸出行,它包含一個(gè)3,緊跟著一個(gè)點(diǎn)和一個(gè)數(shù)字,再緊跟任意個(gè)字符(.*),再跟一個(gè)3(前面標(biāo)識(shí)過(guò)了),一個(gè)或多個(gè)TAB,再跟一個(gè)3. 因?yàn)?前面被標(biāo)識(shí)過(guò),\(3\),所以后面引用只要用\1就可以了。
$ grep '\(3\)\.[0-9].*\1 *\1' /etc/passwd
注:你可以替換3為任意你想要的其他字符
|
- 輸出行,這些行有單詞至少包含9個(gè)連續(xù)的小寫(xiě)字母
$grep '[a-z]\{9,\}' /etc/passwd
|
- 輸出當(dāng)前目錄下文件名,這些文件包含有這樣子的行,這些行包含有'SE'字符串,忽略大小寫(xiě)。
egrep(擴(kuò)展的grep)
元字符
|
功能
|
例子
|
描述
|
+
|
匹配一個(gè)或多個(gè)前導(dǎo)字符
|
'[a-z]+ove'
|
匹配一個(gè)或多個(gè)小寫(xiě)字符,緊跟ove.如love,loove,alove
|
?
|
匹配0個(gè)或一個(gè)前導(dǎo)字符
|
'lo?ve'
|
匹配以l開(kāi)始,緊跟零個(gè)o或者一個(gè)o,在跟ve.如lve,love
|
a|b
|
匹配a或者b
|
'love|hate'
|
匹配love或者h(yuǎn)ate
|
()
|
分組
|
'lov(able|ly)?'
|
匹配lovable或者lovly,或者lov |
$ egrep 'S(h|u)' /etc/passwd
|