linux正則表達式及擴展正則表達式

正則表達式(REGular EXPression, REGEXP)
正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯。
給定一個正則表達式和另一個字符串,我們可以達到如下的目的:
1. 給定的字符串是否符合正則表達式的過濾邏輯(稱作“匹配”);
2. 可以通過正則表達式,從字符串中獲取我們想要的特定部分。
————來自百度百科

使用格式:
grep [option] PATTERN [FILE...]
grep: 根據模式搜索文本,並將符合模式的文本行顯示出來。
Pattern: 文本字符和正則表達式的元字符組合而成匹配條件
支持的常用選項
-i:忽略大小寫
--color:被匹配的字符串顯示顏色
-n:顯示行號
-v:顯示沒有被模式匹配的行
-o:只顯示被模式匹配的字符串
-E:使用擴展正則表達式
-A:表示顯示指定位置的前兩行;例:cat /proc/cpuinfo #grep -A 2 '^core id' /proc/cpuinfo
-B:表示顯示指定位置的後兩行;
-C:表示顯示指定位置的前後各兩行;
A、基本正則表達式支持的元字符(工作在貪婪模式,儘可能多的匹配符合條件的字符串)
\:逃逸字符,用來逃逸後面字符的真是意義
.:匹配任意單個字符
*:匹配前面字符任意次(包括0次)
.*:匹配任意長度任意字符
[abc]:匹配指定範圍內的任意單個字符
[^]:匹配指定範圍外的任意單個字符
常用字符集:
[:digit:]:數字符號
[:lower:]:小寫字母符號
[:upper:]:大寫字母符號
[:punct:]:標點符號
[:space:]:空白字符
[:alpha:]:大小寫字符
[:alnum:]:數字和大小寫字母
^:錨定行首,此字符後面的任意內容必須出現在行首 例:grep '^r..t' /etc/passwd
$:錨定行尾,此字符後面的任意內容必須出現在行尾 例:grep 'w$' /etc/inittab
^$:錨定空白行 例:grep '^$' /etc/inittab
\<或\b:錨定詞首,其後面的任意字符必須作爲單詞首部出現 例:grep "\<root" test.txt
\>或\b:錨定詞尾,其前面的任意字符必須作爲單詞尾部出現
\?:匹配其前面的字符1次或0次
\{n\}:匹配前面字符n次
\{n,\}:匹配前面字符至少n次
\{n,m\}:匹配前面字符n到m次
\(\):分組可以進行後向引用 例:\(ab\)* 表示ab出現0次或者多次 例:grep '\(\..e\).*\1' test3.txt
B、擴展正則表達式支持的元字符
?:匹配其前面的字符1次或0次
+:匹配其前面的字符至少1次 例:grep -E '^[[:space:]]+' /boot/prub/grub.conf
a|b:匹配a或者b 例:egrep 'C|cat' /test.txt
{n}:匹配前面字符n次
{n,}:匹配前面字符至少n次
{n,m}:匹配前面字符n到m次
():分組可以進行後向引用 例:(ab)* 表示ab出現任意次 例:grep '\(\..e\).*\1' test3.txt
P.S:在擴展正則表達式中括號前不需要加“\”,對於前面的分組可以使用\N引用,N表示第N個左括號括起來的內容



練習:
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 '/sbin/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 '\b[0-9]\{1,2\}\b' /etc/passwd
#grep '\<[0-9]\{1,2\}>b' /proc/cpuinfo
8、找出ifconfig命令結果中的1-255之間的整數;
#ifconfig | egrep '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>
9、查找當前系統上名字爲student(必須出現在行首)的用戶的賬號的相關信息,文件爲/etc/passwd
#grep '^student\>' /etc/passwd

#grep '^student:' /etc/passwd
顯示用戶student的id號
#grep '^student\>' /etc/passwd | cut -d: -f3

#id -u student
10、分析/etc/inittab文件中如下文本中前兩行的特徵(每一行中出現在數字必須相同),請寫出可以精確找到類似兩行的模式:
11:1:wait:/etc/rc.d/rc 1
13:3:wait:/etc/rc.d/rc 3
#grep 'l\([0-9]\):\1:wait:/etc/rc.d/rc \1' /etc/inittab

#grep '^l\([0-9]\):\1.*\1$' /etc/inittab 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章