grep , egrep , fgrep
根據pattern,搜尋文字,將符合pattern的文字行顯示出來
pattern:由文字字元,正規表示式的元字元,組合而成的匹配條件
grep [option] pattern [file...]
/etc/passwd中包含了字串root的行? grep 'root' /etc/passwd
-i 忽略大小寫
--color 預設已設定別名中
-v 沒有被模式匹配到的行 grep -v 'root' /etc/passwd
-o 只顯示被模式匹配到的字串本身,每個一行
元字元
. 匹配任意單個字元
/etc/passwd中r開頭,t結尾,中間跟了任意兩個字元? grep 'r..t' /etc/passwd
* 匹配其前面的字元任意次
問題:a, b, ab , aab , acb , adb , amnb,amnbmnbmnb字串中,a*b 能匹配到哪些?
b, ab, aab
a.*b 能匹配到 ab,aab,acb,adb,amnb,amnbmnbmnb
.* 任意長度的任意字元
注意 :預設情況下,正則工作在貪婪模式下,儘可能長的匹配
[root@localhost tmp]# grep 'a*b' grep.test.1
b
ab
aab
acb
adb
amnb
amnbmnbmnb
? 匹配其前面的字元1次,或0次,使用時,一般要加反斜線轉義
[root@localhost tmp]# grep 'a\?b' grep.test.1
b
ab
aab
acb
adb
amnb
amnbmnbmnb
注意:grep是在每行中部分匹配,而不是直接匹配一行的全部,所以只要一行中有部分匹配的也算
\{m,n\} 匹配其前面的字元,至少m次,至多n次
\{1,\} 最少一次
\{0,3\} 最多3次
grep 'a\{1,3\}b' ./grep.test.1
grep 'a.\{1,3\}b' grep.test.1
a.\{1,3\}b ab中間跟1個或2個或3個任意字元
問題:查詢/etc/passwd中,rt中間跟任意兩個字元,並且出現在行首的???
這裡要用到位置錨定
^ 錨定行首 此字元後面的任意內容必須出現在行首
grep '^r..t' /etc/passwd
$ 錨定行尾 此字元前面的任意內容必須出現在行尾
grep 'w$' /etc/inittab 以w結束的行
grep 'b..h$' /etc/passwd
^$ 空白行
grep '^$' /etc/inittab | wc -l
[ ] : 匹配指定範圍內的任意單個字元
[^] :匹配指定範圍外的任意單個字元
字符集合:真正使用,還得使用一個方括號括起來
[:digit:]
[:lower:]
[:upper:]
[:punct:]
[:space:]
[:alpha:]
[:alnum:]
問題:匹配/etc/inittab中,以一個數字結尾的行?
grep '[[0-9]]$' /etc/inittab
grep '[[:digit:]]$' /etc/inittab
問題:以一個空白字元,後面跟數字結尾的行?
[root@localhost tmp]# grep '[[:space:]][[:digit:]]$' /etc/inittab
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
注意:前面有多個空格也是可以匹配到的,因為只要有一個空格+數字結尾就行
錨定詞首詞尾:
\< 或 \b: 其後面得任意字元必須作為單詞首部出現
\> 或 \b: 其前面得任意字元必須作為單詞得尾部出現
注意:特殊字元,標點符號不算
\<root\> 僅這個單詞
[root@localhost tmp]# grep "root\>" test2 以root作為詞尾出現得
this is root.
The user is mroot.
chroot is a command.
grep "\<root" test2
精確匹配一個單詞
[root@localhost tmp]# grep "\<root\>" test2
this is root.
分組: \( \)
ab* : a後面跟任意個b
\(ab\)* : 把ab當作一個整體,ab可以出現0次,1次,任意次
[root@localhost tmp]# grep "\(ab\)*" grep.test.1
a
b
ab
aab
acb
adb
amnb
amnbmnbmnb
因為沒有ab也可以
分組的主要作用:被前面小括號括起來的內容,後面可以使用一個字元再次引用它
he love his lover.
she like her lover.
she like her liker.
she love her liker.
she like him.
查詢l開頭,中間跟任意兩個字元,e結尾,並且還得找到這個行中,和前面l..e找到同樣字串的,並且多了一個r結尾的字串?
注意:要求是一行中,前面找到和後面找的得一致,只是多了一個r
grep 'l..e' test3.file
grep 'l..e.*l..e' test3.file
\1 引用第一個左括號以及與之對應的右括號所包括的所有內容
\2
\3
grep "\(l..e\).*\1" test3.file
問題:查詢/etc/inittab中,行中出現了任意一個數字,行尾又以這個相同數字結尾的?
grep '\([0-9]\).*\1$' /etc/inittab
1、顯示/proc/meminfo檔案中以不區分大小的s開頭的行;
grep -i '^s' /proc/meminfo
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
7、找出某檔案中的,1位數,或2位數;
grep '[0-9]\{1,2\}' /proc/cpuinfo
grep --color '\<[0-9]\{1,2\}\>' /proc/cpuinfo
8、找出ifconfig命令結果中的1-255之間的整數;
9、查詢當前系統上名字為student(必須出現在行首)的使用者的帳號的相關資訊, 檔案為/etc/passwd
grep '^student\>' /etc/passwd | cut -d: -f3
id -u student
student1
student2
10:分析/etc/inittab檔案中如下文字中前兩行的特徵(每一行中出現在數字必須相同),請寫出可以精確找到類似兩行的模式:
l1:1:wait:/etc/rc.d/rc 1
l3:3:wait:/etc/rc.d/rc 3
grep '^l\([0-9]\):\1.*\1$' /etc/inittab
本作品採用《CC 協議》,轉載必須註明作者和本文連結