二十六、正則介紹grep上、grep中、grep下
正則介紹grep
正則:一串有規律的字符串。它使用單個字符串來描述或匹配一系列符合某個句法規則的字符串。很多文本編輯器或其他工具裏,正則表達式通常用來檢索和替換那些符合某個模式的文本內容。許多程序設計語言也都支持利用正則表達式進行字符串操作。對於系統管理員來講,正則表達式貫穿我們的日常運維工作,無論是查找某個文檔,還是查詢某個日誌文件並分析其內容,都或用到正則。
它是一種思想、一種表示方法。只要使用的工具支持這種表示方法,那這個工具就可以處理正則的字符串。常用工具有grep、sed、awk等,其中grep、sed、awk都是針對文本的行進行操作的。
grep/egrep工具
grep [-cinvABC] 'word' filename
最簡單用法:後面跟個關鍵詞,再跟文件名
-c:行數
-i:不區分大小寫
-n:顯示行號
-v:取反,打印不符合要求的行
-r:遍歷所有子目錄
-A:後跟數字,過濾出符合要求的行以及下面n行
-B:同上,過濾出符合要求的行以及上面n行
-C:同上,同時過濾符合要求的行以及上下各n行
-r選項示例:
# grep -r 'root' /etc/
會將/etc/下所有子目錄裏包含有root的文件全部列出來。
若不加-r
# grep 'root' /etc/
grep: /etc/: 是一個目錄
會告訴你/etc/是一個目錄。
不加-r就只能針對文件做。
# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
# grep -r 'root' /etc/ > /tmp/grep.log
# grep passwd /tmp/grep.log
先將/etc/下有root的內容寫入到/tmp/grep.log文件裏去,再從中過濾出passwd。
一個目錄下,過濾所有*.php文檔中含有eval的行
# grep -r --include="*.php" 'eval' /data/
# grep -A2 'root' passwd
# grep -B2 'root' passwd 上面沒有,就沒列出來
root:x:0:0:root:/root:/bin/bash
--
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
正則
grep(中括號用grep)
# grep '[0-9]' passwd 將帶有[0-9]的數字行全部列出來,也可以逗號[0,9],只過濾帶0和9的行。
# grep -v '[0-9]' passwd 過濾出不帶[0-9]的行
# grep -v '^#' inittab 將以#開頭的行全都不顯示出來,一般常用於看配置文件,直接過濾掉註釋行(以#開頭的行)。
# grep '[^0-9]' inittab 將非[0-9]的所有字符都顯示出來。
# grep '^[^0-9]' inittab 將以非[0-9]開頭的行顯示出來。
# grep -v '^[^0-9]' inittab 相反的行,以[0-9]開頭的行。
# grep 'r.o' passwd 此處的“.”代表任意字符,將包含r.o,中間不管什麽字符都顯示出來。
# grep 'r*o' passwd 以r開頭的字符重復0-n次,or,或者ro都可顯示出來,只要是這兩個字符,別的不行。
user3:x:1002:1004::/hrlrrroorome/user3:/bin/bash
# grep '.*' passwd .*表示任意字符,甚至包括空行。
# grep 'dbus.*' passwd
dbus:x:81:81:System message bus:/:/sbin/nologin
# grep 'dbus.*login' passwd
dbus:x:81:81:System message bus:/:/sbin/nologin
egrep(小括號,花括號用egrep)
# grep 'o\{2\}' passwd 表示o出現兩次
# grep 'o\{0,3\}' passwd 0至3次都匹配
# grep -E 'o{2}' passwd
# egrep 'o{2}' passwd
# egrep '(oo){2}' passwd 小括號,兩個oo,範圍
脫義,-E,egrep。任意使用一個。
# egrep 'o+r' passwd +和*類似。表示匹配1個或多個+前面的字符。
# egrep 'o?r' passwd
?表示?前面的字符重復次數為0或1,有就顯示or,沒有就顯示r。
# egrep 'root|nologin' passwd 豎線,代表或者的意思,root或者nologin都顯示出來。
二十六、正則介紹grep上、grep中、grep下