grep是Linux中用于文本處理的最有用和功能最強(qiáng)大的命令之一。grep在一個(gè)或多個(gè)輸入文件中搜索與正則表達(dá)式匹配的行,并將每條匹配的行寫(xiě)入到標(biāo)準(zhǔn)輸出
正則表達(dá)式是與一組字符串匹配的模式。模式由運(yùn)算符,文字字符和元字符組成,它們具有特殊的含義。GNU grep支持三種正則表達(dá)式語(yǔ)法Basic,Extended和Perl-compatible。
當(dāng)沒(méi)有給出正則表達(dá)式類(lèi)型時(shí),grep以Basic的形式調(diào)用,grep將搜索模式解釋為基本Basic正則表達(dá)式。要將模式解釋為擴(kuò)展Extended的正則表達(dá)式,請(qǐng)使用-E/–extended-regexp選項(xiàng)。
在GNU grep的實(shí)現(xiàn)中,基本正則表達(dá)式和擴(kuò)展正則表達(dá)式語(yǔ)法之間在功能上沒(méi)有區(qū)別,且兩者一樣。
唯一的區(qū)別是,在基本正則表達(dá)式中的元字符?,+,{,|,(和)被解釋為文字字符,即不將這些字符作為正則解釋。
為了在使用基本正則表達(dá)式時(shí)保持元字符的特殊含義,必須使用反斜杠\對(duì)字符進(jìn)行轉(zhuǎn)義。稍后我們將解釋這些和其他元字符的含義。
通常,您應(yīng)始終將正則表達(dá)式括在單引號(hào)中,以避免shell解釋和執(zhí)行元字符在shell在意義。
字符匹配
grep命令的最基本用法是在文件中搜索字符或字符串。除了在可以搜索文件的內(nèi)容之外,grep還可以搜索標(biāo)準(zhǔn)輸入的內(nèi)容。
例如要搜索使用bash作為默認(rèn)的登錄shell用戶,則可以在/etc/passwd文件中搜索包含bash字符串的所有行。
以下grep命令將搜索文件的內(nèi)容,然后打印包含使用bash作為登錄shell的用戶:
grep bash /etc/passwd
輸出應(yīng)如下所示:
root:x:0:0:root:/root:/bin/bash
myfreax:x:1000:1000:myfreax:/home/myfreax:/bin/bash
在此示例中,字符串bash是一個(gè)基本的正則表達(dá)式,由四個(gè)字符組成。這告訴grep搜索緊隨其后的b,a,s,h字符串。
默認(rèn)情況下,grep命令區(qū)分大小寫(xiě)。這意味著將大寫(xiě)和小寫(xiě)字符視為不同的字符。要在搜索時(shí)忽略大小寫(xiě),請(qǐng)使用-i/–ignore-case選項(xiàng)。
值得一提的是grep將搜索模式作為字符串而不是單詞進(jìn)行搜索/查找。因此,如果您要搜索gnu,grep還將打印在較大的單詞中嵌入gnu的行。例如cygnus或magnum。
如果搜索一個(gè)完全限定的字符串或者包含空格的字符串,則需要將其用單引號(hào)或雙引號(hào)引起來(lái),這:
grep "Gnome Display Manager" /etc/passwd
行頭與行尾
^ 脫字符號(hào)表示與行的開(kāi)頭的字符串匹配。如果正則表達(dá)式以^ 開(kāi)頭,grep將在每行的開(kāi)頭開(kāi)始匹配^之后的字符串。
以下grep命令將從文件file.txt中搜索以字符串linux開(kāi)頭的行:
grep '^linux' file.txt
$ 美元符號(hào)與行的結(jié)尾字符串匹配。$ 之后表示你需要搜索的內(nèi)容。grep將在每行的行尾匹配$之后的字符串。
以下grep命令將從文件file.txt中搜索以字符串linux結(jié)尾的行:
grep 'linux$' file.txt
除了搜索行的開(kāi)頭和結(jié)尾,您還可以組合使用由^關(guān)鍵詞$構(gòu)造的正則表達(dá)式。將允許搜索指定的內(nèi)容,不是嵌入大字符串匹配的行。
另一個(gè)有用的例子是組合使用^$模式匹配所有空行,即開(kāi)頭與結(jié)束都沒(méi)有內(nèi)容。這在查找空行時(shí)特別有用。
以下grep命令將從文件file.txt中搜索僅包含linux的行:
grep '^linux$' file.txt
匹配單個(gè)字符
. 符號(hào)是與任何單個(gè)字符匹配的元字符。
例如,要包括kan,然后有兩個(gè)字符并以字符串roo”結(jié)尾的任何內(nèi)容,則可以使用以下模式:
grep 'kan..roo' file.txt
中括號(hào)表達(dá)式
[] 中括號(hào)表達(dá)式允許將字符括在中括號(hào) [] 來(lái)匹配一組字符。即從中括號(hào) [] 內(nèi)的字符串任意使用一個(gè)字符來(lái)匹配行。
例如,以下grep命令將從文件file.txt中搜索包含accept或accent的行:
grep 'acce[np]t' file.txt
如果方括號(hào)內(nèi)的第一個(gè)字符是符號(hào)^,則它將匹配方括號(hào)中未括起來(lái)的任意字符。
以下模式將匹配包含除l之外的co.a字符串,.表示任意字符。例如coca,cobalt的任意字符串組合,但不匹配包含cola的行 。
例如,以下grep命令將從文件file.txt中搜索不cola的行:
grep 'co[^l]a' file.txt
您可以通過(guò)指定以連字符分隔的范圍的第一個(gè)和最后一個(gè)字符來(lái)構(gòu)造范圍表達(dá)式,在中括號(hào)表達(dá)式內(nèi)指定一系列字符,而不是一個(gè)一個(gè)地寫(xiě)完所有字符。
例如,[a-e]等同于[abcde],[1-3]等同于[123]。以下表達(dá)式匹配以大寫(xiě)字母開(kāi)頭的每一行:
grep '^[A-Z]' file.txt
grep還支持中括號(hào)包含的預(yù)定義字符類(lèi)別。[:alnum:]表示匹配單個(gè)數(shù)字與字母字符,與[0-9A-Za-z]一樣。[:alpha:]表示匹配單個(gè)字母字符,與[A-Za-z]一樣。
[:blank:]表示匹配單個(gè)空格和制表符。[:digit:]表示匹配單個(gè)數(shù)字0 1 2 3 4 5 6 7 8 9。
[:lower:]表示匹配單個(gè)小寫(xiě)字母字符,與[a-z]一樣。[:upper:]表示匹配單個(gè)大寫(xiě)字母,與[A-Z]一樣。
量詞
量詞可讓您指定匹配項(xiàng)必須出現(xiàn)的次數(shù),即匹配關(guān)鍵詞可以被多次匹配。以下是一些GNU grep支持的量詞。
- 表示匹配零次或者多次。? 表示將前一項(xiàng)匹配零或一次,+ 表示匹配前一項(xiàng)一次或多次。{n}匹配前一項(xiàng)n次,n是數(shù)字。
{n,}至少匹配n次。 {,m}最多匹配前一項(xiàng)m次。 {n,m}匹配前一項(xiàng)必須出現(xiàn)次數(shù)是從n-m次,如果是{2,4},即2至4次。
現(xiàn)在我們已經(jīng)了解正則表達(dá)式的量詞,接下來(lái)我們將使用量詞作為示例。在grep使用量詞進(jìn)行搜索,以及如何避免shell解釋特殊字符*,?等。
*字符與前面的字符匹配零次或多次。以下grep命令示例將匹配sright,right ,ssright等。
正則表達(dá)式sright的量詞表示匹配s字符零次或者多次,即沒(méi)有上限,可以是很多sssss。's*right’給正則表達(dá)式使用單引號(hào),也是避免shell解釋特殊字符的方式。
或運(yùn)算
豎線|或運(yùn)算符使您可以指定不同的可能匹配項(xiàng),這些匹配項(xiàng)可以是文字字符串或正則表達(dá)式。在所有正則表達(dá)式運(yùn)算符中,此運(yùn)算符的優(yōu)先級(jí)最低。
在下面的示例中,我們搜索Nginx的錯(cuò)誤日志文件中出現(xiàn)單詞fatal,error和critical行,如果使用擴(kuò)展的正則表達(dá)式,則不需要對(duì)|進(jìn)行轉(zhuǎn)義。
grep 'fatal\|error\|critical' /var/log/nginx/error.log
grep -E 'fatal|error|critical' /var/log/nginx/error.log
分組
分組是正則表達(dá)式的一項(xiàng)功能,可讓您將模式分組并將其作為引用??墒褂美ㄌ?hào)()創(chuàng)建分組。使用基本正則表達(dá)式時(shí),必須用反斜杠\對(duì)括號(hào)進(jìn)行轉(zhuǎn)義。
正則表達(dá)式可以有多個(gè)組。結(jié)果,匹配捕獲的組通常保存在數(shù)組中,數(shù)組的成員與匹配的組順序相同。這通常只是匹配組本身的順序。
匹配的組保存在數(shù)組中,如果需要對(duì)捕獲的組進(jìn)行引用??墒褂?1, …, $9對(duì)捕獲的組進(jìn)行引用。
以下示例同時(shí)匹配fear和less。 量詞?使(fear)組成為可選。
反斜杠表達(dá)式
GNU grep包含幾個(gè)由反斜杠和常規(guī)字符組成的元字符。以下是一些最常見(jiàn)的特殊反斜杠表達(dá)式。
\b匹配單詞邊界。<匹配單詞開(kāi)頭的空字符串。>在單詞末尾匹配一個(gè)空字符串。 \w匹配一個(gè)單詞。\s匹配空格。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-441595.html
以下模式將匹配單獨(dú)的單詞abject和object。 如果嵌入較大的單詞,則不會(huì)匹配這些單詞:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-441595.html
grep '\b[ao]bject\b' file.txt
到了這里,關(guān)于Linux Grep 正則表達(dá)式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!