Linuxgrep命令用法以及Regex
1.grep命令和Regex的簡介
(1).grep(Global search REgular expression and Print out the line),即全域搜尋Regex並列印出匹配的行,它是Linux系統中一個強大的文本搜尋工具,它根據使用者指定的“模式(pattern)”對目標文本進行過濾,顯示被模式比對到的行;
(2).Regex是由一類字元書寫的模式,其中有些字元不表示符的字面意義,而是表示控制或通配的功能
2.grep命令的基本文法格式
grep [OPTION]... 'PATTERN' FILE...
grep的常用選項:
-v : 對匹配的行進行取反
-o : 僅顯示匹配到的內容
-i : 忽略字元大小寫
-n : 為匹配的行加上行號
-E : 使用擴充Regex ,等同於egrep命令
-F : 不使用Regex搜尋,等同於fgrep命令
-A # : 連同匹配行的下#行一併顯示,#代表任一數字
-B # : 連同匹配行的上#行一併顯示,#代表任一數字
-C # : 連同匹配行的上下#行一併顯示,#代表任一數字
--color=auto : 對匹配的內容以不同的顏色顯示
3.grepRegex的基本用法
基本Regex:
(1)字元匹配
. : 匹配任意單個字元
例:匹配以r開頭,t結尾中間只隔了兩個字元的行
[] : 匹配指定集合中的任意單個字元
常用的集合表示方法有:
純數字:[[:digit:]]或[0-9]
小寫字母:[[:lower:]]或[a-z]
大寫字母:[[:upper:]]或[A-Z]
大小寫字母:[[:alpha:]]或[a-zA-Z]
數字加字母:[[:alnum:]]或[0-9a-zA-Z]
空白字元:[[:space:]]
標點符號:[[:punct:]]
例1:匹配包含數字0或2的行(只包含前半部分)
例2:匹配包含字母r或t的行(只包含前半部分)
例3:匹配包含數字0-9的行(只包含前半部分)
[^] : 匹配指定集合外的任意單個字元
例:匹配包含除1-9範圍之外的字元的行(只包含前半部分)
(2)次數匹配
* : 匹配其前面的字元出現任意次,0、1或多次的行
例:建立一個測試文本,包含有以下內容:
匹配x字母出現任意次的行:
\+ : 匹配其前面的字元出現1次或多次的行
例:匹配x字至少1次的行
\? : 匹配其前面的字元出現0次或1次的行
例:匹配x字母出現0次或1次的行
\{m\} : 匹配其前面的字元出現m次的行
例:匹配x字母出現2次的行
\{m,n\} : 匹配其前面的字元至少出現m次,至多出現n次的行,m和n表示一個範圍m-n
例:匹配x字母至少出現1次,至多出現3次的行
(3)位置錨定
^ : 行首錨定
例:匹配x字母出現在在行首的行
$ : 行尾錨定
例:匹配e字母出現在行尾的行
^$ : 匹配空白行
例:匹配空白的行
\< : 詞首錨定
例:精確匹配xy兩個字母在一個單詞的詞首的行
\> : 詞尾錨定
例:精確匹配xy兩個字母在一個單詞的詞尾的行
\<\> : 匹配單詞
例:匹配包含xy這個單詞的行
(3)分組
\(\) : 對某字串進行進行分組匹配
例:匹配xy單啟出現0次或1次的行
後向引用:模式中,如果使用\(\)實現了分組,在某行文本的檢查中,如果\(\)的模式比對到了某內容,此內容後面的模式中可以被引用;
對前面的分組進行引用的符號為:\1 , \2 ,\3
模式自左而右,引用第#個左括弧以及與其匹配右括弧之間的模式比對到的內容;
後向引用舉例:
建立一個文字檔,假設有如下內容:
找出前後都有相同單詞的行:
Regex元字元總結:
字元匹配:. ,[] ,[^]
次數匹配:* ,\? ,\+ ,\{m\} ,\{m,n\}
位置錨定:^ ,$ ,\< ,\> ,\<\>
分組匹配:\(\)
4.egrep及擴充Regex:
egrep相當於grep -E,egrep可以直接使用擴充Regex,而grep需要加上選項-E;
擴充Regex的元字元:
字元匹配:. ,[] ,[^]
次數匹配:*,?,+,{m},{m,n},{m,},{0,n}
位置錨定:^,$,\>,\<
分組匹配:(),支援後向引用
| : 匹配左側或右側合格行,比如a|b,含有a或b的行都匹配;
例1:egrep 等同於 grep -E
例2:
5.grep練習題:
(1).顯示/proc/meminfo檔案中以大寫或小寫s開頭的行;
# grep -i '^s' /proc/meminfo
(2).顯示/etc/passwd檔案中其預設shell為非/sbin/nologin的使用者;
# grep -v '/sbin/nologin$' /etc/passwd | cut -d: -f1
(3).顯示/etc/passwd檔案中其預設shell為/bin/bash的使用者
進一步:僅顯示上述結果中其ID號最大的使用者
# grep '/bin/bash$' /etc/passwd | cut -d: -f1 | sort -n -r | head -1
(4).找出/etc/passwd檔案中的一位元或兩位元;
# grep '\<[[:digit:]]\{1,2\}\>' /etc/passwd
(5).顯示/boot/grub/grub.conf中至少一個空白字元開頭的行
# grep '^[[:space:]]\+.*' /boot/grub/grub.conf
(6).顯示/etc/rc.d/rc.sysinit檔案中,以#開頭,後面跟至少一個空白字元,而後又有至少一個非空白字元的行;
# grep '^#[[:space:]]\+[^[:space:]]\+' /etc/rc.d/rc.sysinit
(7).找出netstat -tan命令執行結果中包含'LISTEN'的行;
# netstat -tan | grep 'LISTEN[[:space:]]*$
(8).添加使用者bash,testbash,basher,nologin(SHELL為/sbin/nologin),而找出當前系統上其使用者名稱和預設SHELL相同的使用者;
# grep '\(\<[[:alnum:]]\+\>\).*\1$' /etc/passwd
(9).擴充題:建立一個文字檔,假設有如下內容:
He like his lover.
He love his lover.
He like his liker.
He love his liker.
找出其中最後一個單詞是由此前某單詞加r構成的行;
# grep '\(\<[[:alpha:]]\+\>\).*\1r' grep.txt
(10).顯示當前系統上root、centos或user1使用者的預設shell及使用者名稱;
# grep -E '^(root|centos|user1\>)' /etc/passwd
(11).找出/etc/rc.d/init.d/functions檔案中某單詞後面跟一對小括弧'()"的行;
# grep -o '\<[[:alpha:]]\+\>()' /etc/rc.d/init.d/functions
(12).使用echo輸出一個路徑,而使用egrep取出其基名;
# echo /etc/rc.d/ | grep -o '[^/]\+/\?$' | grep -o '[^/]\+'