linux基礎三劍客之grep 1、grep命令 基本介紹 grep命令是文本本過濾工具,是基於一個模式匹配文件的每一行,grep分類:egrep個fgrep。 grep英文名:Global search Regular expression and Print out the line grep命 ...
linux基礎三劍客之grep
1、grep命令
基本介紹
grep命令是文本本過濾工具,是基於一個模式匹配文件的每一行,grep分類:egrep個fgrep。
grep英文名:Global search Regular expression and Print out the line
grep命令的作用:文本所搜工具。根據用戶指定的模式對目標文件逐行進行匹配檢查,並且列印匹配的行
模式:由正則表達式字元串及文本字元所編寫的過濾條件
正則表達式:英文名regular expression,解釋:由一類特殊字元及文本字元所編寫的模式,其中有些字元不表示字元字面意義,而表示控制或者通配的功能
正則表達式分類
基本正則表達式:basic regular expression,簡寫BRE
擴展正則表達式:extend regular expression,簡寫ERE
註意:grep預設支持的是基本正則表達式,但是grep命令可以是用選項-E來使用擴展正則表達式。egrep命令預設支持擴展正則表達式
正則表達式引擎:檢查一個模式是否匹配一段文本信息的程式,不同的編程語言使用的正則表達式引擎可能不同。引擎不同,檢查字元匹配的演算法不同。
grep命令內部自帶了正則表達式引擎來實現文本的檢查
基本語法
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
常用選項
--color-auto:對匹配的文本內容進行著色
-v:顯示不能夠被pattern匹配的行
-i:忽略字元大小寫
-o:僅顯示匹配到的字元串
-q:對匹配或者不匹配的內容不輸出任何信息,表示是靜默模式
-A num:顯示匹配到的行及在這之後多顯示num行
-B num:顯示匹配到的行及在這之前多顯示num行
-C num:顯示匹配到的行及在這之前和之後顯示num行
-E:使用擴展正則表達式
-F:使用固定字元正則表達式
-G:表示使用基本正則表達式
-P:表示使用perl正則表達式
基本正則表達式的元字元
字元匹配元字元
.:匹配任意單個字元
[]:匹配指定範圍內的任意單個字元
[^]:匹配範圍之外的任意單個字元
也支持字元集範圍表示
[:digit:]、[:alnum:]、[:alpha:]、[:lower:]、[:upper:]、[:punct:]
使用案例
[root@oldboy ~]# grep "^[[:alpha:]].[[:alpha:]]$" a.txt hal kde lvm ntp opt pki ppp rpc rpm ssh ssl xdg xml yum qwe
匹配次數元字元
基本介紹
用在要指定次數的字元後邊,用於指定前面的字元要出現的次數
匹配次數元字元
*:匹配前面的字元0次或者多次
使用案例
[root@oldboy ~]# grep "x*y" grep.txt xay xbby
\?:匹配前面的字元0次或者1次
. *:匹配任意長度字元
\+:匹配前面字元至少一次
\{m\}:匹配前面的字元m次。
\{m,n\}:匹配掐面字元至少m次,至多n次
\{m,\}:匹配前面字元至少m次,多則不限
\{0,n\}:匹配前面的字元至多n次
使用註意
為什麼要使用\?-----因為?問號、加號+、大括弧{}在linux中的bash解釋器中有特殊意義,用反斜線在意就讓他表示?問號原來的意義,即?問號在bash中表示任意字元,{}大括弧在bash中表示內容展開,因此為了避免在bash中被解釋,那麼使用反斜線轉義
位置錨定元字元
基本介紹
要求指定的字元串模式必須出現在特定位置,那麼得使用位置錨定元字元
位置錨定元字元有
^:行首錨定,用於模式的最左側
$:行尾錨定,用於模式的最右側
^PATTERN$:用於模式匹配整行
^$:匹配空行
^[[:space:]]*$:匹配整行為空格行或者空行
\<或者\b:單詞的詞首錨定,用於單詞模式的左側
\>或者\b:單詞的詞尾錨定,用於單詞模式的右側
\<PATTERN\>:單詞錨定,用於匹配整個單詞
分組
\(\):用於將一個後者多個字元串捆綁在一起,當做一個整體進行處理,小括弧在bash中也表示特殊符號
後項引用:引用前面的分組括弧中的模式所有匹配的字元(並不是引用匹配的模式,而是引用的匹配模式下的字元串)
案例演示:
[root@oldboy ~]# grep "\(\<[[:alpha:]]\{1,3\}t\>\).*\1" /etc/passwd root:x:0:0:root:/root:/bin/bash halt:x:7:0:halt:/sbin:/sbin/haltView Code
使用註意:
分組括弧中的模式匹配到的內容會被正則表達式引擎記錄於內部的變數中,這些變數的命名方式為:\1,\2,\3...
\1:表示第一次被分組小括弧所匹配的內容
\2:表示第二次被分組小括弧所匹配的內容
.....
舉例:
\(ab\+\(xy\{2,\}\))*
\1匹配上面的:ab\+\(xy\)
\2匹配上面的:xy\{2,\}
使用註意
grep命令預設使用的是貪婪模式匹配,即最大匹配。
為什麼要使用位置錨定符?
grep正則匹配預設是每一行按照正則模式一個字元一個字元的匹配,那麼有匹配的字元串可能出現在一行內容的任意位置,因此,如果我們有需求要匹配的字元串在指定的位置(比如:在行首、行尾、詞首、詞尾),那麼就得使用位置錨定元字元
單詞:在linux正則表達式中表示由特殊符號分割的一個字元串,純數字字元串也算一個單詞(雖然在顯示不算真正意義的單詞)
案例演示題庫
顯示/proc/meminfo文件中以大小寫a、b開頭的行
[root@oldboy ~]# grep -i "^a" /proc/meminfo Active: 38640 kB Active(anon): 19756 kB Active(file): 18884 kB AnonPages: 19592 kB AnonHugePages: 0 kB [root@oldboy ~]# grep "^[aA].*" /proc/meminfo Active: 38612 kB Active(anon): 19720 kB Active(file): 18892 kB AnonPages: 19592 kB AnonHugePages: 0 kBView Code
顯示/etc/passwd文件中不以/bin/bash結尾的行
[root@oldboy ~]# grep -v "/bin/bash$" /etc/passwd
顯示/etc/passwd文件中GID最大的用戶名
[root@oldboy ~]# sort -t: -k3 -n /etc/passwd|tail -n 1 www:x:515:518::/home/www2:/bin/bash [root@oldboy ~]# sort -t: -k3 -n /etc/passwd|tail -n 1|cut -d: -f1 wwwView Code
顯示/etc/passwd的oldboy用戶是否存在,如果存在顯示他的預設shell
[root@oldboy ~]# grep "^\<oldboy\>" /etc/passwd oldboy:x:500:515:lan:/home/oldboy:/bin/csh [root@oldboy ~]# grep "^\<root\>" /etc/passwd && grep "^\<root\>" /etc/passwd|cut -d: -f7 root:x:0:0:root:/root:/bin/bash /bin/bashView Code
顯示/etc/passwd文件中UID是三位數的用戶名
[root@oldboy ~]# grep "\<[[:digit:]]\{3\}\>" /etc/passwd [root@oldboy ~]# grep "\<[[:digit:]]\{3\}\>" /etc/passwd|cut -d: -f1View Code
顯示netstat -tan中出現State是LISTEN的行
[root@oldboy ~]# netstat -tan|grep "LISTEN[[:space:]]*" tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 :::22 :::* LISTEN tcp 0 0 ::1:631 :::* LISTENView Code
顯示/etc/passwd文件中用戶名與預設shell名相同的行
[root@oldboy ~]# grep "\(\<[[:alnum:]]\+\>\).*\1$" /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt bash:x:516:519::/home/bash:/bin/bashView Code
2、egrep命令
基本介紹
擴展正則表達式
egrep = egrep -E
基本語法
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
擴展正則表達式的元字元
字元匹配
.:匹配任意一個字元
[]:匹配範圍內的字元
[^]:匹配範圍外的字元
次數匹配
*:匹配0次或者多次
?:匹配0次或者1次
+:匹配1次或者多次
{m}:匹配m次
{m,n}:匹配至少m次,至多n次
錨定字元
^:錨定行首
$:錨定行尾
\<:錨定詞首
\>:錨定詞尾
分組
()
後項引用變數\1,\2,\3....
或者
a|b:支持二選一(擴展正則表達式比基本正則表達式元字元多了二選一)
練習問題
顯示當前系統能夠root、centOS或者oldboy用戶的預設shell和UID
[root@oldboy ~]# grep -E "^(root|centos|oldboy)\>" /etc/passwd root:x:0:0:root:/root:/bin/bash oldboy:x:500:515:lan:/home/oldboy:/bin/cshView Code
找出/etc/rc.d/init.d/functions文件中,某單詞跟一個小括弧的行
[root@oldboy~]#egrep "^\<[_[:alpha:]]+\>[[:space:]]*\(\)" /etc/rc.d/init.d/functionsView Code
使用echo命令輸出一個命令,使用egrep取出路徑的基名(基名:整個路徑的最後一個文件或者目錄)
[root@oldboy ~]# echo "/etc/fstab" |grep -E -o "[^/]+\/?\>$" fstabView Code
找出ifconfig命令結果中的IP地址
[root@oldboy ~]# ifconfig|grep -E -o "(\<[[:digit:]]+\>\.?){3}\.?[[:digit:]]+" 192.168.173.140 192.168.173.255 255.255.255.0 127.0.0.1 255.0.0.View Code
找出ifconfig命令結果中的1-255的數值
[root@oldboy ~]# ifconfig | grep -E -o "\<[0-5]+\>"|sort -u -n 00 1 2 3 50 140 255 1000 1500View Code
使用註意
如果是擴展正則表達式,那麼它的匹配模式的擴展正則元字元有一些不用轉義,比如:小括弧,大括弧,加號等,但是錨定詞首和詞尾都需要加轉義字元
3、fgrep命令
基本介紹
fgrep命令不支持正則表達式搜索,你搜索字元是什麼,就按照你搜索的去匹配
基本語法
grep [OPTIONS] [-f PATTERN] [FILE...]
基本使用
[root@oldboy ~]# grep -F "a..t" fgrep.txt a..t [root@oldboy ~]# grep -F "^h" fgrep.txt ^hView Code