1. intruduction正則表達式
GREP 全稱Global search Regular Expression and Print out the line,用於搜索文件並將匹配的行打印出來,它可使用regex 來搜索文本。它在一個或多個文件中搜索字符串pattern。若是pattern包括空格,則必須被引用(建議引用全部內容),pattern後的全部字符串被看做文件名。搜索的結果被送到標準輸出,不影響原文件內容。shell
grep可用於shell腳本,由於grep經過返回一個狀態值來講明搜索的狀態,若是模板搜索成功,則返回0,若是搜索不成功,則返回1,若是搜索的文件不存在,則返回2。咱們利用這些返回值就可進行一些自動化的文本處理工做ide
sysopsisui
grep [option] [pattern] [file... ]google
pattern 其實是正則表達式regex, 可用單引號' ' 將pattern括起來以免shell通配的影響。spa
2. option日誌
-# 同時顯示匹配行上下的#行,如:grep -2 pattern filename同時顯示匹配行的上下2行。選項-C的簡寫方式xml
-C grep -C 5 foo file 顯示foo及先後各5行crontab
-B before grep -B 5 foo file 顯示foo及前5行ci
-A after grep -A 5 foo file 顯示foo及後5行
-i,--ignore-case 忽略大小寫差異。
-n,--line-number 在匹配的行前面打印行號,須要修改相應配置文件的內容時至關有用
-c,--count 只打印匹配的行數,不顯示匹配的內容。
-v,--revert-match 反檢索,只顯示不匹配的行。
-V --version
-q,--quiet 取消顯示,只返回退出狀態。0則表示找到了匹配的行;找不到返回1;搜索的文件不存在返回2
-w 只匹配整個單詞
-r/ -R/ -d --recursive #此參數的效果和指定「-d recurse」參數相同,遍歷目錄下的全部文件,
-L:輸出時只顯示不包含匹配項的文件名,一般與-r選項連用來查找帶指定內容的文件。
-l:輸出時只顯示包含匹配項的文件名。
-h --no-filename #在顯示符合樣式的那一列以前,不標示該列所屬的文件名稱。
-H --with-filename #在顯示符合樣式的那一列以前,表示該列所屬的文件名稱。(默認方式)
-s,--silent 不顯示關於不存在或者沒法讀取文件的錯誤信息。
-o:輸出時每行只顯示匹配項內容
-E 至關於egrep,支持擴展的正則表達式
-F 至關於fgrep
--color 高亮顯示匹配項內容,如常常使用的命令別名alias grep='grep --color=auto'
3. grep 中應用正則表達式
Linux中的命令grep, find, sed, awk 等支持regex
正則表達式分爲基本正則表達式(grep -e)和擴展正則表達式(grep -E)。下面分別簡單總結一下。
基本正則表達式base-regex
元數據 |
意義和範例 |
^word |
搜尋以word開頭的行。 grep -vn ‘^#’ regular.txt #過濾掉以#開頭的行。 |
word$ |
搜尋以word結束的行 grep -n ‘.$’ regular.txt, |
^$ |
匹配空行 |
\ |
轉義字符,忽略正則表達式中特殊字符的原有含義 grep -n ‘\$」 regular.txt 搜索包含$的行。 |
. |
匹配任意一個字符。 grep -n ‘e.e’ regular.txt #能夠匹配eee,eae,eve等,但不匹配ee |
* |
匹配任意字符串,長度可爲0。 grep -n ‘go*gle’ regular.txt #能夠匹配glgle,gogle,google..... |
.* |
匹配全部字符 |
[list] |
匹配一系列字符中的一個。 grep -n ‘g[lf]’ regular.txt 能夠匹配gl,gf |
[n1-n2] |
匹配一個字符範圍中的一個字符。 grep -n ‘[0-9]’ regular.txt #匹配數字字符 grep -n '[a-z]' regular.txt #匹配a-z中的任意一個字符 更多示例[a-z],[0-9],[A-Z],[a-zA-Z0-9] |
[^list] |
匹配字符集之外的字符 例如:grep –n ‘[^o]‘ regular.txt 匹配非o字符 |
\<word |
匹配以work開頭的單詞。 grep -n ‘\<g’ regular.txt #匹配以g開頭的單詞 |
word\> |
匹配以word結尾的單詞 grep -n ‘tion\>’ regular.txt #匹配以tion結尾的單詞 |
\{n,m\} |
匹配前面的字符重複次數在n到m之間,包括n和m。 grep -n ‘go\{2,3\}gle’ regular.txt #能夠匹配google, gooogle grep 要對{}轉義 |
\{n\} |
匹配前面的字符重複n次。 |
\{n,\} |
匹配前面的字符n次或n次以上。 |
擴展正則表達式
grep通常狀況下支持基本正則表達式,能夠經過參數-E支持擴展正則表達式,另外grep單獨提供了一個擴展命令叫作egrep用來支持擴展正則表達式,這條命令和grep -E等價。雖然通常狀況下,基本正則表達式就夠用了。特殊狀況下,複雜的擴展表達式,能夠簡化字符串的匹配。
擴展正則表達式就是在基本正則表達式的基礎上,增長了一些元字符。
元數據 |
意義和範例 |
+ |
重複前面字符1到屢次。 grep -nE go+d’ regular.txt , 等價於 grep -n 'go\{1,\}' regular.txt 匹配god,good,goood等等字符串 |
? |
匹配0或1次前面的字符 grep -nE ‘go?d’ regular.txt 等價於grep -n 'go\{0,1\}d' regular.txt 匹配gd,god |
| |
或(or)的方式匹配多個字串 df -h | grep -nE '/var$|/opt/IBM/db2|/tmp$|/var$' 查看指定的多個文件系統的信息 |
() |
匹配整個括號內的字符串,原來都是匹配單個字符 grep -nE ‘g(oo|la)’ regular.txt 匹配good或者glad |
4. 如何對grep中的pattern加引號
事實上, 對字符串的解析是由shell完成再傳遞給grep,因此參考shell的特殊字符,以正確使用引號來確保表達正確,在此仍做簡單說明。
' ' 單引號,字符串保持原樣輸出
" " 雙引號,字符串中的` ` ,$, \ 等特殊字符會被shell解釋替換後,再傳遞給grep
對普通的字符串(沒有特殊字符和空格的字符串)也能夠不加引號,直接搜索。
如
[ade@h test]$ grep -n $HOME regular.txt
2:/home/ade
[ade@h test]$ grep -n "$HOME" regular.txt
2:/home/ade
[ade@h test]$ grep -n '$HOME' regular.txt
5:$HOME
[ade@h test]$ grep -n "\$HOME" regular.txt
5:$HOME
因此除非刻意要使用shell替換功能,不然一直使用單引號來搜索你想要的內容是比較好的習慣。
5. eg
grep -v '^#' file.conf 過濾以#開頭的行
grep -v '^$' 過濾空行
grep -c 'HOME' file.conf 統計文件中HOME的個數
crontab -l | grep grep -v '^#'
crontab -l | grep -n '* 0 /' 查找指定時間的任務
crontab -l | grep -B 2 "check_backup" 你仍須要對應cron job前的註釋,以便清楚其含義。
grep -l 'mdadm' /var/log/* 搜索包含特定內容的日誌文件
grep -2 "initdefault" /etc/inittab 想看看匹配先後兩行的內容
df -g | grep -nE '/var$|/opt/IBM/db2$|/tmp$|/var$' 僅查詢特定分區人信息。
ls -1 | grep 't[abc]ab' 傳遞給grep的字符串爲t[abc]ab. 固然也能夠直接讓shell來解釋來找到想要的文件ls -1 t[abc]ab 。因此使用正則表達時要清楚什麼樣的字符串傳遞給哪個程序處理。
grep '\\' regular.txt 搜索文件中的\而不是\\.
related
egrep 至關於grep -E
fgrep 想當於grep -F