一、簡介
1.1、grep說明
grep命令簡單來說就是linux系統實現文本內容篩選過濾的命令。當我們需要快速定位查找文本(通常是配置文件)中我們需要的內容時,使用grep命令絕對算是最有效的處理方式之一。原因就在于grep可以配合包括“管道”、“正則表達式”等命令完成我們想要的關鍵字篩選過濾功能。個人認為不管是喜歡Linux系統的發燒友,還是DBA、程序員、運維人員、架構師、項目經理等,熟練運用掌握grep命令都是必不可少的。比如在日常工作中令開發人員很頭大的事情就是在查看tomcat中項目運行生成的日志文件,這些日志文件通常內容都非常之多,而快速定位到日志里面的異常錯誤提示信息是必不可少的,這種情況下其中一種解決方案就是采用grep命令來定位查找輸出關鍵信息(當然還有更多其他不錯的解決方案)。
1.2、正則表達式說明
正則表達式(英文:Regular Expression)簡單來說就是一種按特定要求定義的符合某種語法規則語義的字符串。采用正則表達式可以幫助我們實現過濾、篩選等常見功能。例如它可以輕松完成校驗電話、郵箱格式是否正確、url攔截匹配等常用功能,減少了一系列不必要的條件判斷,從而提升工作效率。從實用性角度來說,不管是在linux系統中配合grep命令實現關鍵字查找匹配,還是數據庫編寫sql語句,甚至服務端及前端校驗數據安全性等方面都離不開正則表達式,它幾乎可以說是IT從業人士必須要理解掌握的關鍵技術。
二、用法
首先grep是bash中非常好用的命令,雖然不是系統內置命令,不過一般的linux系統安裝完成之后都會自帶這個命令。grep命令常見用法有三種,分別是grep、egrep和fgrep。下面分別介紹如下三種。
2.1、grep 使用格式如下(關鍵參數標紅):
grep [OPTIONS] PATTERN [FILE…]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]
例1:實現在passwd文件中搜索root用戶并把搜索結構顯示出來的關鍵字標紅,命令如下:
grep –color=auto "root" /etc/passwd
效果如下圖:
例2:只顯示匹配到的關鍵字,不顯示其他內容,命令如下:
grep –color=auto -o "root" /etc/passwd
效果如下圖:
例3:如果想一直顯示關鍵字標紅功能,可以定義別名,保證長期有效,如當前root用戶永久生效此配置,
設置方式如下圖:
例4:搜索結果出現的關鍵字忽略字母大小寫,命令如下:
grep -i "root" /etc/passwd
效果如下圖:
例5:實現搜索結果取反操作(顯示為非匹配的搜索結果),命令如下:
grep -v "abc" test.txt
效果如下圖:
例6:搜索結果顯示行號,命令如下:
grep -n "ab" text.txt
效果如下圖:
例7:查找出匹配的搜索結果前n行、后n行或前后n行,命令如下:
grep -A 2 "AbC" text.txt
grep -B 2 "AbC" text.txt
grep -C 2 "AbC" text.txt
效果如下圖:
例8:grep命令不僅可以查找文本匹配內容,文件夾和文件也能通過grep配合管道實現查找,命令如下:
2.2、grep配合正則表達式
2.2.1、字符匹配
例1:(正則表達式.) 搜索匹配任意單個字符,命令如下:
grep "a.c" test.txt
效果如下圖:
例2:(正則表達式[])搜索指定范圍內匹配的任意單個字符,命令如下:
grep "[ad]" test.txt
效果如下圖:
例3:(正則表達式[^])搜索指定范圍外匹配的任意單個字符,命令如下:
grep "[^ad]" test.txt
效果如下圖:
例4:(正則表達式[0-9]或[[:digit:]])搜索指定數字范圍內匹配到的結果,命令如下:
grep "[0-9]" test.txt 或 grep "[[:digit:]]" test.txt
效果如下圖:
例5:(正則表達式[a-z]或[[:lower:]])搜索指定小寫字母范圍內匹配到的結果,命令如下:
grep "[a-z]" test.txt 或 grep "[[:lower:]]" test.txt
效果如下圖:
例6:(正則表達式[A-Z]或[[:upper:]])搜索指定大寫字母范圍內匹配到的結果,命令如下:
grep "[A-Z]" test.txt 或 grep "[[:upper:]]" test.txt
效果如下圖:
例7:(正則表達式[[:space:]])搜索匹配單行包含空格的內容,命令如下:
grep "[[:space:]]" test.txt
效果如下圖:
例8:(正則表達式[[:punct:]])搜索匹配單行包含標點符號的內容,命令如下:
grep "[[:punct:]]" test.txt
效果如下圖:
例9:(正則表達式[[0-9a-z-A-Z]]或[[:alnum:]])搜索匹配單行包含數字和大小寫字母的內容,命令如下:
grep "[[0-9a-zA-Z]]" test.txt 或 grep "[[:alnum:]]" test.txt
效果如下圖:
例10:(正則表達式[[a-z-A-Z]]或[[:alpha:]])搜索匹配單行包含大小寫字母的內容,命令如下:
grep "[[a-zA-Z]]" test.txt 或 grep "[[:alpha:]]" test.txt
效果如下圖:
2.2.2、次數匹配
例1:(正則表達式*)搜索匹配單行*左側的任意長度的字符,包含0次1次或多次,命令如下:
grep "a*" test.txt
效果如下圖:
例2:(正則表達式.*)搜索匹配單行任意長度的任意字符,包含0次1次或多次,屬于貪婪模式,命令如下:
grep "a.*" test.txt
效果如下圖:
例3:(正則表達式\?)搜索匹配單行\?左側字符出現0次或1次,命令如下:
grep "d\?" test.txt
效果如下圖:
例4:(正則表達式\+)搜索匹配單行\+左側字符至少出現1次,命令如下:
grep "a\+" test.txt
效果如下圖:
例5:(正則表達式\{m\})搜索匹配單行\{m\}左側字符精確出現m次,命令如下:
grep "a\{2\}" test.txt
效果如下圖:
例6:(正則表達式\{m,n\})搜索匹配單行\{m,n\}左側字符至少出現m次,至多出現n次,命令如下:
grep "a\{1,2\}" test.txt
效果如下圖:
例7:(正則表達式\{0,n\})搜索匹配單行\{0,n\}左側字符最多出現n次,命令如下:
grep "a\{0,2\}" test.txt
效果如下圖:
例8:(正則表達式\{m,\})搜索匹配單行\{m,\}左側字符至少出現m次,命令如下:
grep "a\{m,\}" test.txt
效果如下圖:
2.2.3、位置錨定
例1:(正則表達式^)搜索匹配單行錨定行首內容,命令如下:
grep "^a" test.txt
效果如下圖:
例2:(正則表達式$)搜索匹配單行錨定行尾內容,命令如下:
grep "c$" test.txt
效果如下圖:
例3:(正則表達式^$)搜索匹配空白行內容,命令如下:
grep "^$" test.txt
效果如下圖:
例4:單詞錨定:
(正則表達式\<)實現錨定詞首,也可以用\b實現同樣效果
(正則表達式\>)實現錨定詞尾,也可以用\b實現同樣效果
命令如下:
grep "\<12" test.txt 或 grep "\b12" test.txt
grep "test\>" test.txt 或 grep "test\b" test.txt
效果如下圖:
整個單詞錨定:
(正則表達式\<…\>)實現錨定整個詞,也可以用\b實現同樣效果
命令如下:
grep "\<456test\>" test.txt 或 grep "\b456test\b" test.txt
效果如下圖:
例5:分組錨定:
(正則表達式\(\))實現分組錨定,分組匹配到的結果字符,自動被grep記憶在內置變量中,這些變量分別是\1、\2 …并且這些變量可以再次被使用。
\1: 引用,在該模式中自左而右,獲取由第一個左括號以及與之對應的右括號中的模式所匹配到的內容。
\2: 引用,在該模式中自左而右,獲取由第二個左括號以及與之對應的右括號中的模式所匹配到的內容。
命令如下:
grep "\(123\)" test.txt
grep "\(123\).*\1" test.txt
grep "\(456\)….\1\(789\)…\2" test.txt
效果如下圖:
2.2.4、egrep 使用說明
egrep使用格式與grep基本相同(可使用grep -E command實現同樣效果),不過egrep只支持擴展的正則表達式,不支持基本正則表達式。
命令:egrep PATTERN FILE… 或 grep -E PATTERN FILE…
egrep支持如下用法:
字符匹配模式如下:
.
[]
[^]
次數匹配模式如下:
*: 任意次
?:0或1次
+: 至少1次
{m}:精確匹配m次;
{m,n}:至少m次,至多n次;
{m,}:至少m次;
{0,n}:至多次;
位置錨定模式如下:
^
$
\<, \b
\>, \b
分組匹配模式如下:
()
引用:\1, \2, …
或者匹配支持如下:
a|b:a或b 或兩側的所有內容;
egrep或者匹配示例:
(正則表達式|)實現或者匹配,命令如下:
egrep "456|789" test.txt 或 grep -E "456|789" test.txt
效果如下圖:
2.2.5、fgrep 使用說明
fgrep不支持正則表達式,只能實現全部關鍵字匹配,個人感覺實際工作中不太常用。
fgrep示例:
fgrep "abdc" test.txt
效果如下圖:
三.結尾總結
grep以及相關正則表達式是linux系統中日常工作開發必須掌握的命令。egrep實現功能基本與grep相同,只是寫法稍有不同,可根據個人習慣選擇采用grep或egrep命令。fgrep因為不支持正則表達式,因此很少使用。
原創文章,作者:鏡花水月,如若轉載,請注明出處:http://www.www58058.com/7040