grep一些常見的用法,備忘

首先介紹grep的一些常見用法:

grep:根據模式搜索文本,並將符合模式的文本行顯示出來。

其基本格式爲:grep [options] PATTERN [FILE...]

即:grep [選項] 匹配模式 [文件...];其中,中括號表示該選項可省略,...表示可以有多個。PATTERN:文本字符和正則表達式的元字符組合而成匹配條件。

下面介紹grep匹配模式中常用的幾個選項。

grep -i :表示忽略字符的大小寫;其基本用法爲:grep -i PATTERN [FILE...];例如:匹配/etc/inittab文件中的字母a,並忽略其大小寫。其代碼如下:

  1. #grep -i 'a' /etc/inittab

其顯示結果如下圖,將會把所有匹配到的字符a,不管是小寫還是大寫都會先是出來,可以看到大寫字母也出現,但匹配到沒有,卻看不出來。要想看到匹配效果,就需要藉助下面這個選項了。

125211845.jpg

grep --color:表示匹配到的字符用其他顏色顯示出來;其基本用法爲:grep -color PATTERN [FILE...];例如:還用上一個文件,匹配/etc/inittab文件中的字母a,並用其他顏色顯示出來。其代碼如下:

  1. #grep --color 'a' /etc/inittab

其顯示結果將會把匹配到的字符a,用其他顏色顯示出來。如下圖所示:

125739926.jpg

要想顯示字符a,且不管是大寫還是小寫都顯示出來,可在命令行輸入如下代碼:

  1. #grep -i --color 'a' /etc/inittab

其顯示結果如下圖所示,可以看到不管是大寫還是小寫都可以匹配到。

125553341.jpg

grep -v:表示顯示沒有被模式匹配到的行;其用法爲:grep -v PATTERN [FILE...];例如:依然用前面那個文件,在文件/etc/inittab中,顯示沒有字符a的行;其代碼如下:

  1. #grep -v 'a' /etc/inittab

其顯示結果將會把所有不含字符a的行都顯示出來。

125014276.jpg

grep -A n:表示顯示匹配到的行及其後面n行;其基本用法爲:grep -A n PATTERN [FILE...];例如:在文件/etc/passwd中,顯示root用戶的後4行,其代碼如下:

  1. #grep -A 4 'root' /etc/passwd

其顯示結果如下圖:

130735294.jpg

可能有人會問,不是顯示下面4行麼,怎麼多顯示了幾行,其實該命令只是顯示匹配到root字符及其後面4行,要想只顯示用戶爲root的後面4行,只需錨定詞首即可,代碼及結果如下:

  1. #grep -A 4 '^root' /etc/passwd

131158954.jpg

grep -B n:表示顯示匹配到的行及其前面n行;其用法爲:grep -B n PATTERN [FILE...]。例如:顯示文件/etc/fstab中字符proc的錢4行。其代碼如下:

  1. #grep -B 4 'proc' /etc/fstab

其顯示結果爲:

132025521.jpg

grep -C n:表示顯示匹配到的行及其該行前後各n行;其用法爲:grep -C n PATTERN [FILE...]。例如:顯示文件/etc/fstab中字符boot前後各2行。其代碼及顯示結果如下:

  1. #grep -C 2 'boot' /etc/fstab

132620309.jpg

grep -E:表示使用擴展正則表達式,相當於egrep,其用法跟其他選項配合使用。具體用法不在闡述。


基本正則表達式和擴展正則表達式的異同:

先介紹基本正則表達式。基本正則表達式的元字符:

.:表示任意單個字符;

[]:表示匹配範圍內的任意單個字符;

[^]:表示匹配指定範圍外的任意單個字符

字符集和包括:[:digit:]:表示數字;[:lower:]:表示小寫字母;[:upper:]:表示大寫字母;[:punct:]:表示標點符號;[:space:]:表示空格;[:alpha:]:表示所有字母;[:alnum:]:表示所有字母和數字。


匹配次數(默認爲貪婪模式,即儘可能長的匹配):

*:表示匹配其前面的字符任意次

  例:給一串字符:a,b,ab,aab,acb,adb,amnb

  如a*b,則匹配字符有:b,ab,aab

.*:表示匹配任意長度的任意字符

\?:表示匹配其前面的字符1次或0次

\{m,n\}:表示匹配其前面的字符至少m次,至多n次,如:

   \{1,\}:表示匹配至少一次

   \{0,3\}:表示匹配最多三次

位置錨定:

^:錨定行首,此字符後面的任意內容必須出現在行首,如剛剛提到的'^root',表示該字符必須出    現在行首;

$:錨定行尾,此字符前面的任意內容必須出現在行尾

^$:空白行

\<或\b:錨定詞首,其後面的任意字符必須作爲單詞首部出現

\>或\b:錨定詞尾,其後邊的任意字符必須作爲單詞尾部出現

如:\<root\>:在整個文件中,把root作爲整個單詞出現,詞首詞尾詞中都不行,如:mroot、rooter、monrooter均將不匹配。


分組:\(\)

   \(ab\)*:表示ab整體作爲匹配字符,且匹配任意次

\(ab\)\{1,\}:表示ab整體作爲匹配字符,且匹配至少一次

\(ab\):表示ab整體作爲匹配字符

   後向引用

   \1:匹配第一個左括號以及與之對應的右括號所包括的所有內容

   \2:匹配第二個左括號以及與之對應的右括號所包括的所有內容

   \3:匹配第三個左括號以及與之對應的右括號所包括的所有內容

   ......

   如:新建文件test1,其內容如下:

He love his lover.

She like her liker.

He love his liker.

She like her lover.

He like her.

She love he.

   # grep '\(l..e\).*\1' test1:表示匹配前面l開頭,e結尾中間爲任意兩個字符的組,且前後必須相同;

   # grep 'l..e' test1:表示所有的都可以匹配

下面介紹擴展正則表達式。擴展正則表達式的元字符、位置錨定同基本正則表達式相同,不同之處在於次數匹配,且擴展正則表達式多了|符號。


次數匹配:

*:表示其前字符任意次

?:表示其前字符0次或1次

+:表示匹配其前面的字符至少1次

{m,n}:表示至少m次,至多n次

|:即or,例:

   C|cat :表示匹配C或cat

   (C|c)at:表示以大寫或小寫c開頭的cat  

   #grep -E ‘C|cat’ test5

   或者

   #egrep ‘C|cat’ test5

egrep的用法除了在匹配次數上與grep不同外,其他基本相同,且grep -E [options] PATTERN [FILE...]  等同於egrep [options] PATTERN [FILE...] 。


下面給出一些練習題,各位可以做些練習題,加深一下這些命令的用法。各練習題後面都配有參考答案,希望各位能自己先做練習然後再對照答案,不要直接看答案,那樣是沒有多少效果的,同時也希望各位能多多上機,只有勤加練習才能記住各命令的用法。練習題中有些題目會設計到管道的用法,不會做的可以先看看管道的用法然後再做這些練習題。


練習一:

1、顯示/proc/meminfo文件中以不區分大小的s開頭的行;

   # grep '^s' /proc/meminfo -i   或者

# grep '^[sS]' /proc/meminfo

2、顯示/etc/passwd中以nologin結尾的行;

   # grep 'nologin$' /etc/passwd

   取出默認shell爲/sbin/nologin的用戶列表

   # grep 'nologin' /etc/passwd | cut -d: -f1

   取出默認shell爲bash,且其用戶ID號最小的用戶的用戶名

   # grep 'bash$' /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1

3、顯示/etc/inittab中以#開頭,且後面跟一個或多個空白字符,而後又跟了任意非空白字符的行;

  # grep '^#[[:space:]]\{1,\}[^[:space:]]' /etc/inittab

4、顯示/etc/inittab中包含了:一個數字:(即兩個冒號中間一個數字)的行;

  # grep ':[0-9]:' /etc/inittab

5、顯示/boot/grub/grub.conf文件中以一個或多個空白字符開頭的行;

  # grep '^[[:space:]]\{1,\}' /boot/grub/grub.conf

6、顯示/etc/inittab文件中以一個數字開頭並以一個與開頭數字相同的數字結尾的行;

  # grep '\(^[0-9]\).*\1$' /etc/inittab


練習二:

1、找出某文件中的,1位數,或2位數;

   # grep '\<[[:digit:]][[:digit:]]\?\>' /etc/inittab  或者

# grep '\<[0-9]\{1.2\}\>' /etc/inittab

2、找出ifconfig命令結果中的1-255之間的整數;

   # ifconfig | egrep --color '\<[1-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>|\<2[0-4][0-9]\>|\<25[0-5]\>'

   注:該命令顯示結果可能會將非整數也顯示出來,請各位注意,系統默認是不識別小數點的,所以它會把非整數拆分成兩個整數來對待,這點還請注意。

3、查找當前系統上名字爲student(必須出現在行首)的用戶的帳號的相關信息, 文件爲/etc/passwd

   # grep '^student:' /etc/passwd

   若在找出該用戶的ID號,則爲:# grep '^student:' /etc/passwd | cut -d: -f3  或者# id -u student


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章