Linux上文本處理三劍客:
· grep:文本過濾工具(模式:pattern)工具;
· grep:基本正則表達式-E,-F
· egrep:擴展正則表達式,-G,-F
· fgrep:不支持正則表達式,
· sed:stream editor,流編輯器;文本編輯工具;
· awk:Linux上的實現gawk,文本報告生成器(格式化文本)
正則表達式:RegualExpression, REGEXP
由一類特殊字符及文本字符所編寫的模式,其中有些字符不表示期字母意義,而是用於表示控制或通配的功能;
· 基本正則表達式:BRE
· 擴展正則表達式:ERE
區別在於兩者元字符不同
元字符:一個字符出現以後,它並不表示文件本身,而是用來匹配一定範圍內的或者指定符合條件的字符;
grep命令:
grep:Global search REgular expression andPrint
作用:文本搜索工具,根據用戶指定的"模式(過濾條件)"對目標文本逐行進行匹配檢查;打印匹配的行;
模式:有正則表達式的元字符及文本字符所編寫的過濾條件;
正則表達式引擎:
grep [OPTIONS] [PATTERN][FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE][FILE...]
常用選項:
--color=auto:對匹配到的文本着色後高亮顯示
-i:ignorecase,忽略字符大小寫;
-o:僅顯示匹配到字符串本身;
-v,--invert-match:反向匹配
-E:支持使用擴展的正則表達式元字符;
-q,--quiet,--silent:靜默模式;用於腳本內命令執行狀態;
-n或--line-number 在顯示行號;
-A # 匹配的到後面幾行也顯示出來
-B # 匹配的到前面幾行也顯示出來
-C # 上下文,匹配的到前後面幾行也顯示出來
基本正則表達式元字符:
字符匹配:
.:匹配任意單個字符
~]# grep "r..t"/etc/passwd
[]:匹配指定範圍內的任意單個字符
[^]:匹配指定範圍外的任意單個字符
[[:alpha:]][[:digit:]]、[[:lower:]][[:upepr:]] [[:alnum:]] [[:punct:]] [[:space:]]
匹配次數:用在要指定其出現的次數的字符的後面,用戶限制其前面字符出現的次數;
*:匹配器前面的字符任意次:0,1,多次;
例如:grep"x*y"
abxy aby xxxy yab
.*:匹配任意長度的任意字符,貪婪模式,能匹配多長就匹配多長;
\?:匹配其前面的字符0次或者1次;即其前面的字符可有可無的;
\+:匹配其前面的字符一次或多次;即其前面的字符出現至少1次;
\{m\}:匹配其前面的字符m次;
\{m,n\}:匹配其前面的字符至少m次,至多n次;
\{0,n\}:至多n次;
\{m,\}:至少m次;
位置錨定:
^:行首錨定;用於模式的最左側;
$:行尾錨定;用於模式的最右側
^PATTERN$:用PATTERN來匹配整行;
^$:空白行;
^[[:space:]]*$:空行或包含空白字符的行;
單詞:非特殊字符組成的連續字符(字符串)都爲單詞;
\< 或 \b:詞首錨定,用於單詞模式的左側;
grep "\<word"
\> 或 \b:詞尾錨定,用於單詞模式的右側;
grep "word\>"
\<PATTERN\>:匹配完整單詞;
分組及引用:
\(\):將一個或多個字符捆綁在一起,當作一個整體進行處理;
\(xy\)*ab
Note:分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄到內部的變量中,這些變量爲:
\1:模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符;
\2:模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符
\3
後向引用:引用前面的分組括號中的模式所匹配到的字符;
基本正則表達式元字符
練習
1、顯示/etc/passwd文件中不以/bin/bash結尾的行;
~]# grep -v "/bin/bash$"/etc/passwd
2、找出/etc/passwd文件中的兩位數或三位數;
~]# grep "\<[[:digit:]]\{2,3\}\>"/etc/passwd
3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一個空白字符開頭,且後面非空白字符的行;
~]# grep "^[[:space:]]\+[^[:space:]]"/etc/grub2.cfg
4、找出"netstat-tan"命令的結果中以"LISTEN"後跟0、1或多個空白字符結尾的行;
~]# netstat -tan|grep "LISTEN[[:space:]]*$"
He loves his lover.
He likes his lover.
She likes her liker.
She loves her liker.
~]# grep "\(l..e\).*\1" lovers.txt
egrep命令:
支持擴展正則表達式實現類似於grep文本過濾功能:grep -E
egrep [OPTINS] PATTERN [FILE]
選項:與grep選項相似
-G:支持基本正則表達式
擴展正則表達式的元字符:
字符匹配:
.:匹配任意單個字符
[]:匹配指定範圍內的任意單個字符
[^]:匹配指定範圍外的任意單個字符
次數匹配:
*:匹配器前面的字符任意次:0,1,多次;
.*:匹配任意長度的任意字符,貪婪模式,能匹配多長就匹配多長;
?:匹配其前面的字符0次或者1次;即其前面的字符可有可無的;
+:匹配其前面的字符一次或多次;即其前面的字符出現至少1次;
{m}:匹配其前面的字符m次;
{m,n}:匹配其前面的字符至少m次,至多n次;
{0,n}:至多n次;
{m,}:至少m次;
位置錨定:
^:行首錨定;用於模式的最左側;
$:行尾錨定;用於模式的最右側
\<或\b:詞首錨定,用於單詞模式的錨定;
\>或\b:詞尾錨定,用於單詞模式的錨定;
分組及引用
():分組;括號內模式匹配到的字符會被記錄到正則表達式引擎的內部變量中;
後向引用:\1,\2....
或:
a|b:a或b
C|cat:C或cat
(c|C)at:cat或Cat
1、找出/proc/meminfo文件中,所有以大寫或小寫S開頭的行;至少有三種實現方式;
grep "^[sS]"/proc/meminfo
grep -i "^sS"/proc/meminfo
grep -E "^(s|S)"/proc/meminfo
grep -E "^s|^S"/proc/meminfo 2、顯示當前系統上root、centos或者user1用戶的相關信息;
~]# grep -E "^(root|centos|user1\>)"/etc/passwd
3、找出/etc/rc.d/init.d/functions文件中某單詞後跟一個小括號的行;
~]# grep -Eo '_[[:alnum:]]+\(\)'/etc/rc.d/init.d/functions 4、使用echo命令輸出一絕對路徑,使用egrep取出基名;
echo "/root/ssf/erou/dfjl" |egrep -o "\<[[:alpha:]]*\>$"
echo "/root/ssf/erou/dfjl" |grep -Eo "[^/]+/?$"
5、找出ifconfig命令結果中的1-255之間的數值;
ifconfig | grep -oE "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
6、添加用戶bash,testbash, basher以及nologin(其shell爲/sbin/nologin);而後找出/etc/passwd文件中用戶名同shell名的行;
~]# grep -E "^([^:]+\>).*\1$" /etc/passwd