linux三劍客之grep
所謂三劍客的工具有“grep”、“sed” 、“awk”,他們都是不謀而合的文本搜索查找處理的強大工具。grep 是 Ken Thompson 寫的,他也是 Unix 的創造者。
gerp及正則表達式
grep全稱(GLobal search Regular expression and print out the line 全局搜索正則表達式并打印到命令行)
grep是文本搜索工具,根據用戶指定的“模式”(過濾條件),對目標文本逐行進行匹配并打印到命令行界面
模式:由正則表達式的元字符及文本符所編寫的過濾條件
grep又分為grep、egrep、fgrep;其中grep支持基本正則表達式,egrep支持擴展正則表達式,fgrep則不支持正則表達式;至于為什么要分的那么多,因為linux系統上有很多工具,而有的工具只支持基本正則表達式進行搜索,有的卻支持擴展正則表達式,至于fgrep則是用來匹配不用 “模式 ” 作為過濾條件的工具,fgrep的搜索速度比前兩者快很多。
grep的使用
命令格式:
grep [OPTIONS] PATTERN [FILE…]
選項 模式 查找的文件
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]
-e:邏輯或 -f:在文件中調用模式來匹配
命令選項:
–color=auto :對匹配到的文本高亮顯示
-i :忽略字符大小寫
在搜索時不區分字符的大小寫
-o:僅顯示匹配到的文本字符本身
搜索到匹配的字符串時只顯示字符串本身,同行的其他字符不顯示
-v:僅顯示不能被匹配到的行
顯示不能匹配到的其他行,被匹配到的不顯示
-q:靜默模式,即不輸出任何信息
用于測試,常用于在腳本中用于判斷是否能匹配,并不關心匹配到的值
-n:給匹配到的字符所在行添加行號
給匹配到的字符所在行進行標記,行號為字符所在文本中的行數
-c:統計匹配到的行的行數
計算出匹配到的字符的所有行總數,只顯示總數
-e:邏輯或
同時匹配多個條件時使用一個條件前加一個-e選項
-w:匹配的字符串為整個單詞
匹配時不以字符進行匹配,必須為單獨的一個單詞才能匹配到
-A:顯示匹配到的行的前N行(N為要顯示的行數)
顯示匹配到的行的前面幾行
-B:顯示匹配到的行的后N行(N為要顯示的行數)
顯示匹配到的行的后面幾行
-C:顯示匹配到的行的前后N行(N為要顯示的行數)
顯示匹配到的行的前面和后面幾行
-E:使用egrep進行搜索
支持擴展正則表的式進行搜索
-F:使用fgrep進行搜索
不支持正則表達式進行搜索
基本正則表達式的元字符:
用于對要匹配的字符模糊匹配,即顯示出符合模式的字符,匹配方式有:字符匹配、匹配字符次數、字符串位置錨定、分組及引用
字符匹配:
模糊對字符進行大概的類型進行查找
. :任意單個字符
[ ]: 指定范圍內的任意單個字符
[^]:指定范圍外的任意單個字符
其中用于[]和[^]中的還有一些常用的元字符:
[:space:] 所有空格和tab鍵
[:upper:] 所有大寫字母
[:lower:] 所有小寫字母
[:alpha:] 所有大小寫字母
[:alnum:] 所有數字和大小寫字母
[:digit:] 所有數字
[:punct:] 所有標點符號
注意:如[:punct:]等是一個整體,所以使用時需在加上外圍內或范圍外的中括號
匹配次數:
匹配要查找的字符出現過幾次
*:匹配其前面的字符任意次(0、1、多次)
.*:匹配任意長度的任意字符
\?:匹配其前面的字符0次或1次(此字符前面一個字符可有可無)
\+:匹配其前面的字符至少1次,可以多次
\{m\}:匹配其前面的字符m次
\{m,n\}:匹配其前面的字符至少m次,至多n次(包括給定的次數)
\{0,n\}:匹配其前面的字符至多n次
\{m,\}:匹配其前面的字符至少m次
位置錨定:
對字符的位置進行錨定查找
1.對行的位置進行錨定
^: 行首錨定(用于模式的最左側)
$:行尾錨定(用于模式的最右側)
^PATTERN$:用PATTERN匹配整行
^$:空白行(不包括空格字符)
^[[:space:]]$:空白行(包括空格字符的行)
2.對要查找的單詞進行位置錨定;單詞:非特殊字符組成的字符(字符串,包括數字)
\<或\b:詞首錨定,用在單詞的最左側
\>或\b:詞尾錨定,用在單詞的最右側
\<PATTERN\>:用于匹配整個完整單詞
注意:\b則用在要匹配單詞模式的左右則即可,在左側則為詞首,右側則為詞尾
分組及引用:
分組:
\(\):將一個字符或多個字符捆綁在一起當做一個整體來進行處理,可以引用此前匹配到的結果
引用:
引用前面分組匹配到的結果;分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄在內部變量中,使用此變量即可調用保存的結果再次進行匹配。
變量則為:\1、\2、\3、\4………………
\1:表示模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符
\2: 表示模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符
egrep的使用
命令格式:
egrep [OPTIONS] PATTERN [FILE…]
選項 模式 查找的文件
命令選項:
–color=auto :對匹配到的文本高亮顯示
-i :忽略字符大小寫
在搜索時不區分字符的大小寫
-o:僅顯示匹配到的文本字符本身
搜索到匹配的字符串時只顯示字符串本身,同行的其他字符不顯示
-v:僅顯示不能被匹配到的行
顯示不能匹配到的其他行,被匹配到的不顯示
-q:靜默模式,即不輸出任何信息
用于測試,常用于在腳本中用于判斷是否能匹配,并不關心匹配到的值
-n:給匹配到的字符所在行添加行號
給匹配到的字符所在行進行標記,行號為字符所在文本中的行數
-c:統計匹配到的行的行數
計算出匹配到的字符的所有行總數,只顯示總數
-w:匹配的字符串為整個單詞
匹配時不以字符進行匹配,必須為單獨的一個單詞才能匹配到
-A:顯示匹配到的行的前N行(N為要顯示的行數)
顯示匹配到的行的前面幾行
-B:顯示匹配到的行的后N行(N為要顯示的行數)
顯示匹配到的行的后面幾行
-C:顯示匹配到的行的前后N行(N為要顯示的行數)
顯示匹配到的行的前面和后面幾行
-F:使用fgrep進行搜索匹配
不支持正則表達式進行搜索
-G:使用grep進行搜索匹配
支持正則表達式進行搜索
擴展正則表達式的元字符:
用于對要匹配的字符模糊匹配,即顯示出符合模式的字符,匹配方式有:字符匹配、匹配字符次數、字符串位置錨定、分組及引用
字符匹配:
模糊對字符進行大概的類型進行查找
. :任意單個字符
[ ]: 指定范圍內的任意單個字符
[^]:指定范圍外的任意單個字符
其中用于[]和[^]中的還有一些常用的元字符:
[:space:] 所有空格和tab鍵
[:upper:] 所有大寫字母
[:lower:] 所有小寫字母
[:alpha:] 所有大小寫字母
[:alnum:] 所有數字和大小寫字母
[:digit:] 所有數字
[:punct:] 所有標點符號
注意:如[:punct:]等是一個整體,所以使用時需在加上外圍內或范圍外的中括號
匹配次數:
匹配要查找的字符出現過幾次
*:任意次
?:匹配其前面的字符0次或1次(此字符前面一個字符可有可無)
+:匹配其前面的字符至少1次,可以多次
{m}:匹配其前面的字符m次
{m,n}:匹配其前面的字符至少m次,至多n次(包括給定的次數)
{0,n}:匹配其前面的字符至多n次
{m,}:匹配其前面的字符至少m次
位置錨定:
對字符的位置進行錨定查找
1.對行的位置進行錨定
^: 行首錨定(用于模式的最左側)
$:行尾錨定(用于模式的最右側)
^PATTERN$:用PATTERN匹配整行
^$:空白行(不包括空格字符)
^[[:space:]]$:空白行(包括空格字符的行)
2.對要查找的單詞進行位置錨定;單詞:非特殊字符組成的字符(字符串,包括數字)
\<或\b:詞首錨定,用在單詞的最左側
\>或\b:詞尾錨定,用在單詞的最右側
\<PATTERN\>:用于匹配整個完整單詞
注意:\b則用在要匹配單詞模式的左右則即可,在左側則為詞首,右側則為詞尾
分組及引用:
分組:
():將一個字符或多個字符捆綁在一起當做一個整體來進行處理,可以引用此前匹配到的結果
引用:
引用前面分組匹配到的結果;分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄在內部變量中,使用此變量即可調用保存的結果再次進行匹配。
變量則為:\1、\2、\3、\4………………
\1:表示模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符
\2: 表示模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符
或:
| :前一個或者后一個
fgrep:不支持正則表達式元字符
當不需要用到元字符去進行匹配字符時,使用fgrep速度更快
練習題:
1、顯示當前系統root、 mage或wang用戶的UID和默認shell
[root@localhost /]# egrep "^(root|wang|mage)\b" /etc/passwd | cut -d: -f3,7
2、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)后面跟一個小括號的行
[root@localhost /]# grep "^[[:alnum:]_].*()" /etc/rc.d/init.d/functions
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
[root@localhost testdir]# echo "/etc/aa/bb/" | egrep "[^/]+*/?$"
4、使用egrep取出上面路徑的目錄名
[root@localhost testdir]# echo "/etc/aa/bb" | egrep "^[^[:alnum:]]+.*/"
6、顯示ifconfig命令結果中所有IPv4地址
ifconfig | egrep --color=auto "(\b([1-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b\.)(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b\.){2}(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b)"
7、顯示/proc/meminfo文件中以大小s開頭的行; (要求:使用兩種方式)
[root@localhost testdir]# grep "^[S|s]" /proc/meminfo [root@localhost testdir]# grep -i "^s" /proc/meminfo
8、顯示/etc/passwd文件中不以/bin/bash結尾的行
[root@localhost testdir]# grep -v "/bin/bash$" /etc/passwd
9、顯示用戶rpc默認的shell程序
[root@localhost testdir]# grep "^\brpc\b" /etc/passwd | cut -d: -f3,7
10、找出/etc/passwd中的兩位或三位數
[root@localhost testdir]# grep "\([[:digit:]]\)\{2,3\}" /etc/passwd
11、顯示/etc/grub.cfg文件中,至少以一個空白字符開頭的且后面存非空白字符的行
[root@localhost testdir]# grep "^[[:space:]].*[^[:space:]]" /etc/grub.conf
12、找出"netstat -tan"命令的結果中以'LISTEN'后跟0、 1或多個空白字符結尾的行
[root@localhost testdir]# netstat -tan | grep "\bLISTEN[[:space:]]*$"
13、找出/etc/passwd文件中用戶名同shell名的行
[root@localhost /]# egrep "^(\<.*\>)+.*\1$" /etc/passwd [root@localhost testdir]# egrep "^([[:alpha:]]+):.*\1$" /etc/passwd
14、用正則表達式表示IP地址
[root@localhost testdir]# ifconfig | egrep --color=auto -o "(\b([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|2[0-2][0-3]])\b\.)(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b\.){2}(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\b)"
15、用正則表達式表示手機號11 13 17 15 18
egrep "\b1[345678][0-9]{9}\b"
原創文章,作者:Lii,如若轉載,請注明出處:http://www.www58058.com/29892