2021-05-12 14:32:11
grep文字過濾工具與正規表示式
grep文字過濾工具
命令:grep
格式:grep [OPTIONS] PATTERN
選項: --color=auto 將匹配的結果著色顯示
-v 反向匹配
-i 忽略大小寫
-n 顯示的結果前增加行號
-c 僅顯示匹配到結果的行數
-o 僅顯示匹配到的字串
-q 靜默模式,不輸出任何資訊
相當於 &> /dev/null
-A# 顯示關鍵字行及向後#行
-B# 顯示關鍵字行及向前#行
-C# 顯示關鍵字向前#行,當前行,及向後#行
-e 關鍵字1 -e 關鍵字2 實現多個選項間的邏輯or關係
-w 匹配整個單詞
-E 使用擴充套件正規表示式 或egrep
-F 不使用正規表示式 或 fgrep
Patten格式:參照變數或文字用“”or‘’引起來,
參照命令則用``(反引號)引起來。
正規表示式
正規表示式是由一類特殊字元及文字字元所編寫的模式,其中有些字元(元字元)不表示字元字面意義,而表示控制或通配的功能。支援程式有grep,sed,awk,vim,less,nginx,varnish……它分為基本正規表示式和擴充套件正規表示式兩類,用於grep中,則grep後支援基本正規表示式,grep -E或egrep後支援擴充套件正規表示式。
字元匹配
字元 |
含義 |
. |
匹配單個字元 |
[] |
匹配指定範圍內的任意單個字元 |
[^] |
匹配指定範圍外的任意單個字元 |
[:alnum:] |
所有字母和數位 |
[:alpha:] |
所有大小寫字母(a-z&A-Z) |
[:lower:] |
小寫字母(a-z) |
[:upper:] |
大寫字母(A-Z) |
[:digit:] |
十進位制數位(0-9) |
[:xdigit:] |
十六進位制數位 |
[:blank:] |
空白字元(空格和製表符tab) |
[:space:] |
水平和垂直的空白字元(比[:black:]範圍廣) |
[:punct:] |
標點符號 |
[:graph:] |
可列印的非空白字元 |
[:print:] |
可列印字元 |
[:cntrl:] |
不可列印的控制字元(退格、刪除、警鈴……) |
匹配次數
匹配次數用於要指定次數的字元後面,用於指定前面的字元要出現的次數。
字元 |
含義 |
* |
匹配前面的字元任意次,包括0次 (貪婪模式:盡可能長的匹配) |
.* |
匹配任意長度的任意字元 |
? |
匹配其前面的字元0次或1次 |
+ |
匹配其前面的字元至少1次 |
{n} |
匹配其前面的字元n次 |
{m,n} |
匹配其前面的字元至少m次,至多n次 |
{,n} |
匹配其前面的字元至多n次 |
{n,} |
匹配其前面的字元至少n次 |
位置錨定
位置錨定用於定位出現的位置。
字元 |
含義 |
^ |
行首錨定,用於模式的最左側 |
$ |
行尾錨定,用於模式的最右側 |
^PATTERN$ |
用於模式匹配整行 ^$ 空行 ^[[:space:]]$ 空白行 |
< or b |
詞首錨定,用於單詞模式的左側 |
> or b |
詞尾錨定,用於單詞模式的右側 |
<PATTERN> |
匹配整個單詞 |
後向參照
說到後向參照,我們先要了解一個概念——分組。分組就是用()把一個或多個字元捆綁在一起,當做一個整體進行處理,當然,在我們的基本正規表示式中,()需要用來跳脫,所以,用法如下:
(root)+ 代表匹配root至少一次
在分組括號中的模式匹配到的內容會被正規表示式引擎記錄與內部的變數中,這些變數的命名方式為:1,2,3……
n就是從左側起第n個左括號以及與之匹配的有括號之間的模式所匹配到的字元。
eg:(string1+(string2)*)
1 :string1+(string2)*
2 :string2
後向參照:參照前面的分組括號中的模式所匹配的字元,而非模式本身。
單說概念大家應該不會很明白,那我們來看一個例子,因為後向參照很重要,所以我們就說細緻一點。(敲黑板!劃重點!)
這個是我們的檔案,如果我們想匹配所有行,應該怎麼做呢?就用到我們上面所說到的正規表示式的知識。
我們把這個命令單獨拉出來說:grep "^h.{4}.*h.{4}$" example
^h.{4}表示匹配以h後加任意4個字元為開頭,.*表示匹配任意多個字元,h.{4}$表示匹配以h後加任意4個字元為結尾。hello和hiiii都是以h後跟4個任意字元組成的,所以上述命令就可以匹配所有的行。
那麼,如果我只想匹配開頭和結尾單詞一樣的行呢?也就是職匹配前兩行。這個時候,我們就要用到後向參照了,如下:
上述命令就可以完成我們的需求,我們來詳細的說一下這個命令。
分為兩部分:紅框內:(h.{4}) 藍框內:1
先說紅框內的,這個和我們上一個範例沒有區別,只是加了()括起來,含義還是不變,依然表示h後跟任意4個字元。
那麼藍框內呢?是什麼意思?
“1”表示的就是從左側起第1個左括號以及與之匹配的有括號之間的模式所匹配到的字元。上述我們只有一對括號,所以藍框內的“1”表示的就是紅框內“(h.{4})”所匹配到的內容。如果沒看明白,那麼看看下面這張圖吧:
現在可以明白為什麼要新增括號分組了嗎?因為當我們新增了括號分組,“h.{4}”就成為整個正則中第1個分組中的正則,當“h.{4}”匹配到的結果為hello時,“1”參照的就是hello,當“h.{4}”匹配到的結果是hiiii時,“1”參照的就是hiiii。
這個就是所謂的後項參照了。當然,2,3的內容相信也就不言而喻了。
擴充套件的正規表示式
命令:egrep = grep -E
格式:egrep [OPTIONS] PATTERN [FILE...]
擴充套件的正規表示式與正規表示式的元字元大致一樣。為什麼叫他擴充套件的正規表示式呢?因為在擴充套件正規表示式中,除了詞首詞尾錨定和後項參照以外,其他的元字元都可以直接參照,不需要加“”跳脫。
小練習
講了這麼多東西,我們來做一些題練練手吧~提供的答案僅為參考,因為不同的解題思路,你的解題步驟也會有所不同喏,小夥伴們盡情發揮吧(〃'▽'〃)
1、統計當前連線本機的每個遠端主機IP的連線數,並按從大到小排序
netstat -tun |grep "[0-9]" |tr -s " " ":" |cut -d: -f6 |sort |uniq -c |sort -n
2、顯示/etc/passwd檔案中不以/bin/bash結尾的行
cat /etc/passwd | grep -v /bin/bash$
3、找出/etc/passwd中的兩位或三位數
cat /etc/passwd |grep "b[0-9]{2,3}b"
4、顯示CentOS7的/etc/grub2.cfg檔案中,至少以一個空白字元開頭的且後面存非空白字元的行
cat /etc/grub2.cfg |grep "^[[:space:]]+[^[:space:]].*$"
5、 使用egrep取出/etc/rc.d/init.d/functions中其基名
echo /etc/rc.d/init.d/functions | egrep -o "[^/]+/?$"
6、找出/etc/rc.d/init.d/functions檔案中行首為某單詞(包括下劃線)後面跟一個小括號的行
cat /etc/rc.d/init.d/functions |egrep "^.*[^[:space:]]()"
7、統計last命令中以root登入的每個主機IP地址登入次數
last |grep ^root |egrep -o "([0-9]{1,3}.){3}[0-9]{1,3}" |sort |uniq -c
8、顯示ifconfig命令結果中所有IPv4地址
ifconfig | egrep -o "<(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4]0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])>"
9、顯示三個使用者root、mage、wang的UID和預設shell
cat /etc/passwd |egrep "^(root|mage|wang)b" |cut -d: -f3,7
10、只利用df、grep和sort,取出磁碟各分割區利用率,並從大到小排序
df |grep sd |grep -Eo "[0-9]{1,3}%" |sort -nr
Linux命令-檔案文字操作grep http://www.linuxidc.com/Linux/2015-12/126259.htm
grep正規表示式 http://www.linuxidc.com/Linux/2015-09/123035.htm
Linux中正規表示式與檔案格式化處理命令(awk/grep/sed) http://www.linuxidc.com/Linux/2013-03/81018.htm
Linux基礎之grep和正規表示式 http://www.linuxidc.com/Linux/2016-10/136250.htm
14 個 grep 命令的例子 http://www.linuxidc.com/Linux/2015-05/117626.htm
Linux文字處理工具grep和正規表示式及egrep與grep區別 http://www.linuxidc.com/Linux/2016-08/134046.htm
Linux基礎之-正規表示式(grep,sed,awk) http://www.linuxidc.com/Linux/2017-05/144221.htm
Linux文字處理工具及grep http://www.linuxidc.com/Linux/2017-03/142277.htm
grep命令中文手冊(info grep翻譯) http://www.linuxidc.com/Linux/2017-09/146645.htm
grep 命令系列:如何在 UNIX 中根據檔案內容查詢檔案 http://www.linuxidc.com/Linux/2016-01/128017.htm
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-09/146932.htm
相關文章