一、定義:
GREP :Global search REgular expression and Print out the line的縮寫。是一種強大的文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查;并把匹配的行打印出來。
模式:由正則表達式字符及文本文字符所編寫的過濾條件
REGEXP(正則表達式):有一類特殊字符及文本字符所編寫的模式,其中有些字符不表示字符的字面意義,而表示控制或通配的功能
分為:1、基本正則表達式:BRE(grep支持)
2、擴展正則表達式:ERE(egrep支持)
二、grep用法:
grep [OPTIONS] PATTERN [FILE…] Note:egrep和grep的用法一致
選項:
–color=auto : 對匹配到的文本著色顯示
-v:顯示不能夠被pattern匹配到的行
-i:忽略字符大小寫
-o:僅顯示匹配到的字符串
-q:靜默模式,不輸出任何信息
-A #:after,顯示匹配到的行及后#行
-B #:before,顯示匹配到的行及前#行
-C #:context,顯示匹配到的行及前后各#行
-E:使用ERE grep -E = egrep
三、正則表達式:
基本正則表達式元字符:
1、字符匹配
點號(.):匹配任意單個字符
[ ]:匹配指定范圍內的任意單個字符
[ ^ ]:匹配指定范圍外的任意單個字符
[[:digit:]],[0-9] 表示0-9的任意數字
[[:lower:]], [a-z] 表示26個小寫英文字母
[[:upper:]], [A-Z] 表示26個大寫英文字母
[[:alpha:]], [a-zA-Z] 表示所有英文字母
[[:alnum:]], [[0-9a-zA-Z] 表示數字,所有英文字母
[[:space:]] 表示空白字符
[[:punct:]] 表示符號字符
2、匹配次數:用在要指定次數的字符后面用于指定前面的字符要出現的次數
*:匹配前面的字符任意次,任意長度(*自身表示匹配的次數,本身無任何意義,與glob不同)
ex:grep “x*y”:abxy,xay,xxxxxxy(貪婪模式,盡可能多的匹配)
.*:任意長度的任意字符
\?:匹配其前面的字符0或1次;即前面的字符可有可無
\+:匹配其前面的字符至少一次
\{m\}:匹配前面的字符m次
\{m,n\}:匹配前面的字符至少m次,至多n次
\{0,n\}:匹配前面的字符至多n次
\{m,\}:匹配前面的字符至少m次
3、位置錨定:
^:行首錨定,用于模式的最左側
$:行尾錨定,用于模式的最右側
^PATTERN$:用于模式匹配整行
^$:空行
^[[:space:]]*$
\<或\b:詞首錨定:用于單詞模式的左側
\>或\b:詞尾錨定:用于單詞模式的右側
\<PATTERN\>:匹配整個單詞
4、分組:
\(\):將一個或多個字符捆綁在一起,當作一個整體進行處理
\(xy\)*ab
后向引用:引用前面的分組括號中的模式所匹配字符(而非模式本身)
Note:分組括號中的額模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為\1、\2、\3,….
\1:從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
ex:\(ab\+\(xy\)*\)
\1:\(ab\+\(xy\)*
\2:xy
擴展正則表達式元字符
1、字符匹配:和基本正則表達式元字符相同
2、次數匹配:和基本正則表達式元字符不同,無須轉義字符\
*:
.*:任意長度的任意字符
?:匹配其前面的字符0或1次;即前面的字符可有可無
+:匹配其前面的字符至少一次
{m}:匹配前面的字符m次
{m,n}:匹配前面的字符至少m次,至多n次
{0,n}:匹配前面的字符至多n次
{m,\}:匹配前面的字符至少m次
3、錨定匹配:和基本正則表達式元字符相同
4、分組匹配:和基本正則表達式元字符不同,無須轉義字符\
()
后向引用和基本正則表達式元字符相同
5、或者:
a|b
C|cat:C或cat
NOTE:fgrep不支持正則表達式搜索,只搜索固定字符串。
如:
練習:
1、顯示/proc/meminfo文件中以大小s開頭的行(要求:使用兩種方式)
(1)、grep -i '^s' /proc/meminfo
(2)、grep '^[Ss]' /proc/meminfo
2、顯示/etc/passwd文件中不以/bin/bash結尾的行
grep -v '/bin/bash$' /etc/passwd
3、顯示/etc/passwd文件中ID號最大的用戶的用戶名
sort -t: -k3 -n /etc/passwd|tail -1|cut -d: -f1
4、如果用戶root存在,顯示其默認的shell程序
id root &> /dev/null && grep '^root\>' /etc/passwd | cut -d: -f7
5、找出/etc/passwd中的兩位或三位數
grep –color=auto '\<[0-9]\{2,3\}\>' /etc/passwd
6、顯示出/etc/rc.d/rc.sysinit文件中,至少以一個空白字符開頭的且后面存非空白字符的行
grep '[[:space:]]\+[^[space]]\+' /etc/rc.d/rc.sysinit
7、找出“netsat -tan”命令的結果中以‘LISTEN’后跟0、1或多個空白字符結尾的行
netstat -tan|grep 'LISTEN[[:space:]]*$'
8、添加用戶bash、testbash、basher以及nologin(其shell為/sbin/nologin);而后找出/etc/passwd文件中用戶名同shell的行
useradd bash
useradd basher
useradd testbash
useradd -s /sbin/nologin nologin
grep '^\([[:alnum:]]\+\>\).*\1$' /etc/passwd
9、顯示當前系統root、centos或user1用戶的默認shell和UID(使用egrep)
egrep '^(root|user1|centos)\>' /etc/passwd|cut -d: -f3,7
10、找出/etc/rc.d/init.d/function文件(cnegtos6)中某單詞后面跟一個小括號的行
egrep -o '^[_[:alpha:]]+\(\)' /etc/rc.d/init.d/functions
11、使用echo輸出一個路徑,使用egrep取出其基名
echo '/mnt/sdc' |egrep -o '[^/]+/?$'|cut -d'/' -f1
原創文章,作者:Net18-天津-康康,如若轉載,請注明出處:http://www.www58058.com/14112
寫標簽提高文章收錄率,樣式上建議使用markdown