- 正則表達式 --用于文本精確匹配
(1).: 代表任意單個字符,除了換行符
(2)*: 前導字符出現(xiàn) 0 次 或 多次
(3).*: 任意長度的字符
(4)^: 行的開頭
(5)$: 行的結(jié)尾
(6)^$: 空行
(7)[abc] 以字符為單位的或關系
(8)[a-z] [A-Z] [0-9]
(9)[^abc] 取非
(10)^[abc] a或b或c開頭的行
(11)^[^abc] 非a或非b或非c開頭
(12)\<: 取單詞的頭
(13)\>: 取單詞的尾
正則表達式是一種描述方法,一種小型的語言,用字符來表示某種含義的符號
一個點代表一個字符
例1 樣式.T.代表3個字符,中間的字符是T 左右兩邊是任意一個字符
例2 ... 代表字符長度是3的字符串,如果要對比 請加入轉(zhuǎn)意符
例3 data... 代表data.后接3個字符,入data.txtt data.cf data.123
^在行首
例如 樣式^jack 代表jack應出現(xiàn)在行首,才符合條件 如jack ding
表示尾部
例 樣式123$ 表示在最后一個行是123才符合條件 如jack123
123jack
以下是常見用法
[A-Z] 匹配一個大寫的字母
[a-z]匹配一個小寫的字母
[0-9]一個數(shù)字
[^A-Z]除了大寫字母之外的一個字符
[^a-zA-Z] 一個非英文字母的字符
[^a-zA-Z0-9] 一個非英文字母,并且非數(shù)字的字符
^出現(xiàn)在括號里的第一個位置 表示"非/不是"的意思
*出現(xiàn)0個以上
*表示前面的字符出現(xiàn)0個或者多個
例 aA*c 代表A這個字符可能出現(xiàn)0個或者0個以上 如:ac aAc aAAc
{...}指定符合的個數(shù)
指定符合的個數(shù)
指定前面字符的個數(shù)
例如:{3,5}表示前面的字符有3到5個。[a-z]{3,5}、代表以小字母組成的字符串,長度是3到5
(..)把比對符合的字符串暫時保存起來
例如:H(..)y表示要保存H和y之間的3個字符
若要提取保存的字符串,可以用位置參數(shù)。1代表第一個保存的字符串,2代表第二個保存的字符
支持正則表達式工具
- grep/egrep find locate sed awk vim
grep 'regex' file --把正則表達式寫在單引號中,防止shell解釋正則表達式
grep -E 'regex' file --匹配擴展的正則表達式在grep中需要加-E選項
egrep=grep -E
# find / -regex '.*\.iso$'
# find / -regex '^\/var.*\.iso$'
locate -r
# locate -r '^\/var.*\.iso$'
sed -n '/^root/p' /etc/passwd
awk '/^root/ {print $0}' /etc/passwd
vim
/^root
/nologin$
:%s/^root/ROOT/g
- grep
o:只打印匹配出來的字符
n:顯示行號
v:取反
l:匹配成功,打印文件
c:統(tǒng)計匹配到的字符的數(shù)量,但是統(tǒng)計的是行數(shù),而不是匹配的字符個數(shù)
A:匹配行后幾行
B:匹配行前幾行
C:匹配行前后幾行, 如 -C 2 與 -2
i:忽略大小寫
q:靜默執(zhí)行,一般在測試時,取返回值用
r/R:對一個目錄下的所有文件進行搜索
--color:用特殊顏色標示匹配到的關鍵字
H: 列出匹配到關鍵字的文件路徑
egrep:拓展正則搜索
egrep = grep -E
# cat grep.txt
ggle
gogle
google
gooogle
gagle
gaagle
gaaagle
abcgef
abcdef
操作如下:
grep 'g.g' grep.txt --只要兩個g字母中間有一個任意字符就可以
grep 'g*g' grep.txt --只要有一個g字母就可以。等同于grep g grep.txt
grep 'go*g' grep.txt --只要兩個g字母中間有零個o或多個o就可以
grep 'g.*g' grep.txt --只要兩個g字母中間有零個或任意個字符就可以
grep 'go.*g' grep.txt --只要go與g字母中間有零個或任意個字符就可以
/etc/passwd
grep ^...t /etc/passwd --查找每行里第四個字符為t的行
grep o.....$ /etc/passwd --查找每行里倒數(shù)第六個字符為o的行
grep s..n /etc/passwd --查找每行里有s和n字符,并且中間有兩個字符的行
grep x:4: /etc/passwd --查找uid為4的行(只使用grep和正則表達式,不使用cut或awk的截取)
grep .*:.:4:.*:.*:.*:.* /etc/passwd --查找uid里是4的行
grep .*:.:.*4.*:.*:.*:.*:.* /etc/passwd --查找uid里包括4的行
grep .*:.*:.*:.*::.*:.* /etc/passwd --查找/etc/passwd里注釋列為空的行
grep -v .*:.*:.*:.*::.*:.* /etc/passwd --查找/etc/passwd里注釋列不為空的行
grep .*:.*:.*:.*:..*:.*:.* /etc/passwd
grep .*:[!x].*:.*:.*:.*:.*:.*:.*:.* /etc/shadow --查找不能在登錄界面用密碼正常登錄的用戶
grep root /etc/passwd -- 過濾關鍵字
grep '^root' /etc/passwd -- 以 root 開頭的行
grep 'bash$' /etc/passwd -- 以 bash 結(jié)尾的行
grep '^$' /etc/passwd -- 查找空行
grep '^[ru]' /etc/passwd -- r 或 u
grep '[0-9]' /etc/passwd -- 查找數(shù)字
grep '^[^abc]' /etc/passwd -- 取反,非 a 非 b 非 c 開頭
grep '\<root\>' /etc/passwd -- \< 取單詞的頭,\> 取單詞的尾
grep -E '^root|^zhang' /etc/passwd --color -- 拓展正則 , -E,匹配以root 或 zhang 開頭
grep -n root /etc/passwd -- 帶行號過濾
grep -oE '(([0-9]{1,3}\.){3}[--9]{1,3})' /var/log/secure --在文本過濾IP地址
grep [[:digit:]] /etc/passwd
grep [[:lower:]] /etc/passwd
grep [[:upper:]] /etc/passwd
grep [[:space:]] /etc/passwd
grep [[:alnum:]] /etc/passwd