grep 是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。Unix的grep家族包括grep、egrep和fgrep。
reaexp:正則表達式(regular expressions)
常見程序支持reaexp:grep,sed,awk,vim,less,nginx,varnish
reaexp分兩類:
基本正則表達式:BRE(base regular)
擴展正則表達式:ERE(extension regular)
grep -E,egrep
用法:把正則表達式轉義符刪除
正則表達式引擎:
採用不一樣的算法,檢查處理正則表達式的軟件模塊
nginx
基本用法
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
OPTIONS:
- -m # 匹配#行後中止匹配
- -v 顯示不被匹配的行
- -i 忽略大小寫
- -o 只顯示匹配到的內容
- -n 顯示匹配到的行號
- -c 統計匹配行的行數
- -q 靜默模式,不輸出任何信息
- -A # 匹配到的後#行(after)
- -B # 匹配到的前#行(before)
- -C # 匹配到的先後#行
- -e 實現多個選項間的邏輯or關係
- grep -e "cat" -e "dog" file
- -w 匹配整個單詞
- -E 使用擴展正則表達式
- -F 使用fgrep,不支持正則表達式
- -f file 根據模式文件處理
字符匹配:
- . 匹配任意單個字符
- [] 匹配指定範圍的任意單個字符 例:[123] 僅匹配123中的任一字符
- [^] 匹配指定範圍外的任意(單個)字符
- [:space:]:全部水平和垂的空白字符(比[:blank:]包含的範圍廣)
- [:blank:]:水平空白字符(空格和製表符)
- [:punct:]:標點符號
- [:alnum:]:字母和數字
- [:alpha:]:a-z A-Z
- [:lower:]:小寫字符
- [:upper:]:大寫字符
- [:digit:]:數字
- [:cntrl:]:不可打印的控制字符(退格、刪除、警鈴...)
- [:graph:]:可打印的空白
- [:xdigit:]:十六進制數字
次數匹配:
- * 匹配任意次(包括0次) 貪婪模式能匹配多少就是多少
- .* 匹配任意長度任意字符
- \? 匹配其前面字符0次或1次(0次)
- \+ 匹配其前面字符至少1次或以上
- \{m,n\} 匹配其前面字符至少m次,至多n次
- \{n\} 匹配其前面字符n次
- \{m,\} 匹配其前面字符至少m次
- \{,n\} 匹配其前面字符至多n次
位置錨定:
- ^ 行首錨定
- $ 行尾錨定
- ^pattern$ 匹配整行
- ^$ 匹配空行
- ^[[:space:]] 匹配空白字符行
- \< 詞首錨定
- \> 詞尾錨定
- \<pattern\> 匹配整個單詞
分組:
- \(\) 將多個字符組合在一塊兒,組成一個總體
- \1,\2,\3 後向引用,後向引用是表明分組匹配的最後結果,而不是正則表達式
- \(stirng1\+(string2\)*\)
- \1:string1+\(string2\)*
- \2:string2
- abc\|d 表示abc或者d
- \(abc\|d\) 表示abc或者abd
- ^\(a\|b\) 以a或b開頭的
grep匹配用法:
非惟一答案,如用法不對或可優化之處,請及時聯繫或評論git
- 匹配ifconfig命令的全部ip地址
ifconfig | grep "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"
- 找出/etc/passwd中的兩位或三位數
grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd
- 匹配/etc/fstab開頭不是#號的行,且不是空行
grep "^[^#]" /etc/fstab
- 匹配分區使用率最大的的分區
df | grep `df | grep "/dev/sd" | grep -o "[[:digit:]]\{1,3\}%" | sort -nr | head -1 ` | cut -d " " -f1
- 顯⽰兩個⽤戶root、user的UID和默認shell
grep "root\|user" /etc/passwd | cut -d ":" -f3,7
- 匹配目錄基名
echo "/etc/rc.d/init.d/functions" | grep -o "[^/]\+$"
- 匹配目錄名
echo "/etc/rc.d/init.d/" | grep -o "/.*[^/]" | grep -o "/.*/" | grep -o "/.*[^/]"
echo "/etc/rc.d/init.d/" | grep -o "[^/]\+" | tail -1