阿銘在前面多次用到了grep命令,可見它的重要性。該命令的格式為:grep [-cinvABC] 'word' filename,其常用的選項(xiàng)如下所示。
-c:表示打印符合要求的行數(shù)。
-i:表示忽略大小寫。
-n:表示輸出符合要求的行及其行號。
-v:表示打印不符合要求的行。
-A:后面跟一個(gè)數(shù)字(有無空格都可以),例如-A2表示打印符合要求的行以及下面兩行。
-B:后面跟一個(gè)數(shù)字,例如-B2表示打印符合要求的行以及上面兩行。
-C:后面跟一個(gè)數(shù)字,例如-C2表示打印符合要求的行以及上下各兩行。
首先看看-A、-B和-C這3個(gè)選項(xiàng)的用法。
-A2 會把包含halt的行以及這行下面的兩行都打印出來:
# grep -A2 'halt' /etc/passwd halt7halt:/sbin:/sbin/halt mail8mail:/var/spool/mail:/sbin/nologin operator11operator:/root:/sbin/nologin說明:在Rocky8系統(tǒng)中,grep默認(rèn)幫我們把匹配到的字符串標(biāo)注了紅色,這點(diǎn)還是挺貼心的。其實(shí)大家可以用which命令看一下grep,你會發(fā)現(xiàn)grep其實(shí)是grep --color=auto,這個(gè)選項(xiàng)就是顏色顯示。
-B2 會把包含halt的行以及這行上面的兩行都打印出來:
# grep -B2 'halt' /etc/passwd sync5sync:/sbin:/bin/sync shutdown6shutdown:/sbin:/sbin/shutdown halt7halt:/sbin:/sbin/halt
-C2 會把包含halt的行以及這行上下各兩行都打印出來:
# grep -C2 'halt' /etc/passwd sync5sync:/sbin:/bin/sync shutdown6shutdown:/sbin:/sbin/shutdown halt7halt:/sbin:/sbin/halt mail8mail:/var/spool/mail:/sbin/nologin operator11operator:/root:/sbin/nologin
下面阿銘舉幾個(gè)典型實(shí)例來幫你更深刻地理解grep。
12.1.1過濾出帶有某個(gè)關(guān)鍵詞的行,并輸出行號
示例命令如下:
# grep -n 'root' /etc/passwd 1x0/root:/bin/bash 10x0/root:/sbin/nologin
說明前面的數(shù)字顯示為綠色,表示行號。
12.1.2過濾出不帶有某個(gè)關(guān)鍵詞的行,并輸出行號
示例命令如下:
# grep -nv 'nologin' /etc/passwd 1x0/root:/bin/bash 6x0/sbin:/bin/sync 7x0/sbin:/sbin/shutdown 8x0/sbin:/sbin/halt 45x1000/home/aminglinux:/bin/bash
12.1.3過濾出所有包含數(shù)字的行
示例命令如下:
# grep '[0-9]' /etc/inittab # multi-user.target: analogous to runlevel 3 # graphical.target: analogous to runlevel 5
說明只要有一個(gè)數(shù)字就算匹配到了。
12.1.4過濾出所有不包含數(shù)字的行
示例命令如下:
# grep -v '[0-9]' /etc/inittab # inittab is no longer used. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target # # systemd uses 'targets' instead of runlevels. By default, there are two main targets: # # # To view current default target, run: # systemctl get-default # # To set a default target, run: # systemctl set-default TARGET.target
說明:和上一例的結(jié)果正好相反,只要是包含一個(gè)數(shù)字,就不顯示。
12.1.5過濾掉所有以#開頭的行
操作樣例文檔/etc/sos.conf的內(nèi)容如下:
[plugins] #disable = rpm, selinux, dovecot [tunables] #rpm.rpmva = off #general.syslogsize = 15 # grep -v '^#' /etc/sos.conf [plugins] [tunables]
說明:這里面是含有空行的。
那如何將空行刪除呢?示例命令如下:
# grep -v '^#' /etc/sos.conf |grep -v '^$' [plugins] [tunables]在正則表達(dá)式中,^表示行的開始,$表示行的結(jié)尾,那么空行則可以用^$表示。如何打印出不以英文字母開頭的行呢?我們先來自定義一個(gè)文件,如下所示:
# mkdir /tmp/1 # cd /tmp/1 # vim test.txt //內(nèi)容如下 123 abc 456 abc2323 #laksdjf Alllllllll
接下來看兩個(gè)例子:
# grep '^[^a-zA-Z]' test.txt 123 456 #laksdjf # grep '[^a-zA-Z]' test.txt 123 456 abc2323 #laksdjf前面也提到過中括號[]的應(yīng)用,如果是數(shù)字就用[0-9]這樣的形式(當(dāng)遇到類似[15]的形式時(shí),表示只含有1或者5)。如果要過濾數(shù)字以及大小寫字母,則要寫成類似[0-9a-zA-Z]的形式。另外,[^字符]表示除[]內(nèi)字符之外的字符。請注意,把^寫到方括號里面和外面是有區(qū)別的。
12.1.6過濾出任意一個(gè)字符和重復(fù)字符
示例命令如下:
# grep 'r.o' /etc/passwd root0root:/root:/bin/bash operator11operator:/root:/sbin/nologin
.表示任意一個(gè)字符。上例中,r.o表示把r與o之間有一個(gè)任意字符的行過濾出來。
# grep 'ooo*' /etc/passwd root0root:/root:/bin/bash lp4lp:/var/spool/lpd:/sbin/nologin mail8mail:/var/spool/mail:/sbin/nologin operator11operator:/root:/sbin/nologin setroubleshoot981:/var/lib/setroubleshoot:/sbin/nologin
*表示零個(gè)或多個(gè)*前面的字符。上例中,ooo*表示oo、ooo、oooo...或者更多的o。
# grep '.*' /etc/passwd |wc -l 45 # wc -l /etc/passwd 45 /etc/passwd
上例中,.*表示零個(gè)或多個(gè)任意字符,空行也包含在內(nèi),它會把/etc/passwd文件里面的所有行都匹配到,你也可以不加|wc -l看一下效果。
12.1.7指定要過濾出的字符出現(xiàn)次數(shù)
示例命令如下:
# grep 'o{2}' /etc/passwd root0root:/root:/bin/bash lp4lp:/var/spool/lpd:/sbin/nologin mail8mail:/var/spool/mail:/sbin/nologin operator11operator:/root:/sbin/nologin setroubleshoot981:/var/lib/setroubleshoot:/sbin/nologin這里用到了符號{},其內(nèi)部為數(shù)字,表示前面的字符要重復(fù)的次數(shù)。需要強(qiáng)調(diào)的是,{}左右都需要加上轉(zhuǎn)義字符。另外,使用“{ }”還可以表示一個(gè)范圍,具體格式為{n1,n2},其中n1 < n2,表示重復(fù)n1到n2次前面的字符,n2還可以為空,這時(shí)表示大于等于n1次。 除grep工具外,阿銘也常常用到egrep這個(gè)工具,后者是前者的擴(kuò)展版本,可以完成grep不能完成的工作。
下面阿銘介紹egrep不同于grep的幾個(gè)用法。為了試驗(yàn)方便,阿銘把test.txt編輯成如下內(nèi)容:
rot0/rot:/bin/bash operator11operator:/root:/sbin/nologin operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash 1111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
12.1.8過濾出一個(gè)或多個(gè)指定的字符
示例命令如下:
# egrep 'o+' test.txt rot0/rot:/bin/bash operator11operator:/root:/sbin/nologin operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash # egrep 'oo+' test.txt operator11operator:/root:/sbin/nologin operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash # egrep 'ooo+' test.txt operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash和grep不同,這里egrep使用的是符號+,它表示匹配1個(gè)或多個(gè)+前面的字符,這個(gè)“+”是不支持被grep直接使用的。包括上面的{},也是可以直接被egrep使用,而不用加轉(zhuǎn)義。示例如下:
# egrep 'o{2}' /etc/passwd root0root:/root:/bin/bash lp4lp:/var/spool/lpd:/sbin/nologin mail8mail:/var/spool/mail:/sbin/nologin operator11operator:/root:/sbin/nologin setroubleshoot981:/var/lib/setroubleshoot:/sbin/nologin
12.1.9過濾出零個(gè)或一個(gè)指定的字符
示例命令如下:
# egrep 'o?' test.txt rot0/rot:/bin/bash operator11operator:/root:/sbin/nologin operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash 1111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa # egrep 'ooo?' test.txt operator11operator:/root:/sbin/nologin operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash # egrep 'oooo?' test.txt operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash
12.1.10過濾出字符串1或者字符串2
示例命令如下:
# egrep 'aaa|111|ooo' test.txt operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash 1111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
12.1.11egrep中()的應(yīng)用
示例命令如下: # egrep 'r(oo|at)o' test.txt operator11operator:/root:/sbin/nologin operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash這里用()表示一個(gè)整體,上例中會把包含rooo或者rato的行過濾出來,另外也可以把()和其他符號組合在一起,例如(oo)+就表示1個(gè)或者多個(gè)oo。如下所示:
# egrep '(oo)+' test.txt operator11operator:/root:/sbin/nologin operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash
好了,grep常用的就這些,足夠你在工作中用了。
審核編輯:劉清
-
grep
+關(guān)注
關(guān)注
0文章
22瀏覽量
4723
原文標(biāo)題:一篇文章總結(jié)完grep用法
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論