先來小菜一碟:
cat /etc/passwd | grep -c "/bin/bash$"
以上,用來統計/etc/passwd 文件中以/bin/bash結尾的用戶個數。
grep用來基於正則去實現行過濾的工具;它有很多衍生命令:
egrep 擴展的grep,即默認使用擴展正則表達式的grep,更高級。
fgrep 專用於文件行過濾的工具。
grep命令的常用選項:
-E 開啟擴展正則模式,相當於使用egrep命令
-F 關閉正則表達式,將PATTERN看做字符串直接匹配
-G 默認,開啟基本正則表達
-P 開啟perl兼容正則模式,利用perl語言中的正則匹配,表示我不會,因此不涉及
以上,屬於pattern匹配方式的選擇————————————————————
-e 該選項針對"-",由於grep默認不支持pattern中包含"-" 的匹配。使用-e可以避免報錯。
-f 將PATTERN寫入指定文件,通過該選項,可調用文件中的PATTERN去匹配目標文件
-i 匹配時,忽略大小寫進行
-v 排除PATTERN,顯示剩余沒有被匹配到的內容行
-w 將PATTERN視為一個單詞(前后不是非字母就是一個結束),相當於PATTERN中加入了 " \bPATTERN\b"去定界。
-x 當PATTERN匹配了整行內容時,才輸出到屏幕;如
[root@localhost tmp]# cat /etc/passwd |grep "^root"
root:x:0:0:root:/root:/bin/bash
[root@localhost tmp]# cat /etc/passwd |grep -x "^root"
[root@localhost tmp]# cat /etc/passwd |grep -x "^root.*"
root:x:0:0:root:/root:/bin/bash
以上是幫助PATTERN提高性能的選項——————————————————
-c PATTERN成功匹配到內容的次數
--color= 設置高亮方式,可以用{never|always|auto} 來實現
-L 當grep目標文件是多個文件時,結果會輸出“文件名:匹配行內容”的形式。-L則只將不包含匹配行的文件名輸出。和-v類似。
-R 遞歸查詢匹配目錄子文件,當目標文件類型為目錄時
-o 只輸出被PATTERN匹配到的內容,而非默認輸出整行內容
-m # 匹配到內容的最大輸出行數,如三行包含PATTERN,只輸出兩行,即可-m 2
-q 靜默執行
-s 無提示,stderr會被忽略,-sq組合可完全屏蔽grep的輸出
以上是對grep結果的規范選項—————————————————————
-H 輸出文件名,在行內容前,當目標文件為多個時,默認
-n 顯示行號
以上針對grep結果查看的選項—————————————————————
-A # 顯示匹配行及其后#行內容,理論上共#+1行
-B # 顯示匹配行及其前#行內容,理論上共#+1行
-C # 顯示匹配行及其前后#行內容,理論上共2#+1行
關於grep命令的執行狀態碼:
0 成功匹配
1 未匹配
2 報錯,一般是目標文件不存在
基本正則表達式:
其中,\( \) 不僅可以用作反向引用的匹配范圍,也可以用於組合字符串。如下例:
[root@localhost tmp]# echo "xyz2xyzxy" |grep "xyz\?" -o
xyz
xyz
xy -----xy被匹配到
[root@localhost tmp]# echo "xyz2xyzxy" |grep "\(xyz\)\?" -o
xyz
xyz ------xy被為匹配到,由於xyz是一個組合,\?針對的是這個組合而言
擴展正則表達式:
基於基本正則表達式;
\? 變為 ?
\+ 變為 +
\{\}相關的PATTERN一律變為{} 的PATTERN,省去了\標志
\(\) 變為 ()
同時引入了 " | " 表示邏輯或,表示匹配多個內容:
chkconfig --list 3:on |grep -vE "crond|network|sshd|syslog"
更多示例: