grep正則表達式詳解及練習linux
1、在學習grep正則表達式前,先了解下linux著名的文本處理三劍客:正則表達式
(1)grep、egrep、fgrep 文本搜索工具。shell
(2)sed 文本編輯工具,一種流編輯器,行編輯工具。centos
(3)awk 強大的文本分析工具,文本格式化工具,文本報告生成器。bash
以上三大命令均支持正則表達式,本文以grep正則表達式爲例展開學習。編輯器
一、什麼是正則表達式?ide
正則表達式(Regular Expression):由一類特殊字符及文本字符所編寫的模式,其有些字符不表示其字面意義,而是用於表示控制或通配的功能。正則表達式只是字符串的一種描述(一種表示法),只有和支持正則表達式的工具相結合才能進行字符串處理。工具
二、正則表達式的構成:學習
正則表達式由兩種字符構成。一種是在正則表達式中具體特殊意義的「元字符」,另外一種是普通的「文本字符」。元字符能夠是一個字符,如「^」,也能夠是一個字符序列,如「\b」。測試
三、主要分爲兩類:(1)基本正則表達式(BRE)
(2)擴展正則表達式(ERE)
2、本文以grep爲例來說解正則表達式
一、grep家族有三大成員分別爲:
grep:支持使用基本正則表達式。
egrep:支持使用擴展正則表達式。
fgrep:不支持使用正則表達式。
二、grep命令:
功能:根據用戶指定的」pattern(過濾條件)「對目標文本逐行進行匹配檢查;打印出符合條件的行,即文本搜索工具。注:PATTERN即過濾條件指由文本字符及正則表達式元字符所編寫的字符串。
經常使用選項一:
--color=auto,每次grep搜索以後,自動高亮顯示所匹配字符。
CentOS7定義了grep別名alias grep=’grep--color=auto’
-i:忽略字符大小寫
-o:僅輸出文件中匹配到的部分
-v:反向查找,輸出文件中不匹配的行。
-q:進入靜默模式,該模式下,grep命令運行目的僅僅是執行一個條件測試,一般在腳本中使用,經過檢查其返回值進行下一步操做。
經常使用選項二:
-E:支持使用擴展正則表達式,至關於egrep;
-F:支持使用固定字符串,不支持正則表達式,至關於fgrep;
-G:支持使用基本正則表達式;
-P:支持使用pcre正則表達式;
-A:顯示匹配字符串及後n行的數據
-B:顯示匹配字符串及前n行的數據
-C: 顯示匹配字符串及先後各n行的數據
-e:多模式機制;
-f:FILE爲每行包含了一個pattern的文本文件,即grep script;
-n:在行首顯示行號
三、基本正則表達式元字符:
(1)字符匹配:
.:匹配任意單個字符
[ ]:匹配範圍內的任意單個字符 [abc]表示「a」或「b」或「c」
[^ ]:匹配範圍外的任意單個字符 [^abc]表示除了「a」、「b」、「c」外的其餘任意字符。
(2)匹配次數: 用在要指定其出現的次數的字符後面,限制其前面字符出現的次數,默認工做在貪婪模式。
*: 匹配前面的字符任意次(0、一、或屢次),至關於\{0,\};
.*:任意長度的任意字符;
\+:匹配前面的字符至少1次,至關於\{1,\};
\?:匹配前面的字符0次或者1次,即前面的字符無關緊要;
\{m\}:其前面的字符出現m次,m爲非負整數;
\{m,n\}:其前面字符出現最少m次最多n次,\{m,\}最少m次,\{o,n\}最多n次;
(3)位置錨定:限制使用搜索模式搜索文本,限制模式所匹配到的文本只能出現於目標文本的那個位置
^: 行首錨定;用於模式的最左側,^PATTERN , ^hello搜尋以hello開頭的行。
$: 行尾錨定;用於模式的最右側,PATTERN$ , hello$搜尋以hello結束的行。
^PATTERN$: 讓PATTERN徹底匹配一整行, ^how are you$搜索內容爲」how are you」的行。
^$ :搜尋內沒有任何字符的行(包括空白字符),空行
^[[:space:]]*$ :空行或僅有空白字符的行;
(4)單詞錨定: Linux中的單詞指:由非特殊字符組成的連續字符(字符串)。
\<或\b: 詞首錨定,用於單詞模式的左側,\<PATTREN或\bPATTERN
\>或\b: 詞尾錨定,用於單詞模式的右側,PATTERN\>或PATTREN\b
\<PATTERN\>:單詞錨定
(5)分組與引用:
\(PATTERN\):將此PATTERN匹配到的字符做爲一個不可分割的總體進行處理;分組匹配到的內容會被正則表達式引擎自動記錄到內部變量中,這些變量是\1,\2,\3,…
pat1\(pat\2)pat3\(pat4\(pat5\)pat\)
\1:第一組括號中的pattern匹配到的字符串,從左側起,第一個左括號及與之匹配的右括號內模式匹配到的內容。
\2:第二組括號中的pattern匹配到的字符串,從左側起,第二個左括號及與之匹配的右括號內模式匹配到的內容。
後向引用:引用前面括號中的模式所匹配到的字符
輸出結果中行首字符跟行尾字符相同(行尾引用了行首匹配到內容)。
四、egrep命令:
支持使用擴展正則表達式的grep命令,至關於grep -E,其經常使用選項基本同grep命令,可參考上文。
五、擴展正則表達式元字符:
擴展正則表達式就是在基本正則表達式的基礎上,增長了一些元字符,並且有部分參數是不須要添加\轉義符使用的。
(1)字符匹配:
.:匹配任意單個字符
[ ]:匹配範圍內的任意單個字符
[^ ]:匹配範圍外的任意單個字符
(2)匹配次數:
*: 匹配前面的字符任意次(0、一、或屢次);
.*: 任意長度的任意字符;
+: 匹配前面的字符至少1次
?: 匹配前面的字符0次或者1次,即前面的字符無關緊要;
{m}:其前面的字符出現m次,m爲非負整數;
{m,n}: 其前面字符出現最少m次最多n次,{m,}最少m次,{o,n}最多n次
(3)位置錨定:
^:行首
$:行尾
\<, \b:詞首
\>,\b:詞尾
(4)分組及引用:
( ):分組
\1,\2,…:後向引用
注意:特殊用法
C|cat:表示C或cat ,表示整個左側或整個右側。
(C|c)at:表示Cat或cat
3、做業練習:
一、顯示/etc/passwd文件中以bash結尾的行;
二、找出/etc/passwd文件中的三位或四位數;
三、找出/etc/grub2.cfg文件中,以致少一個空白字符開頭,後面又跟了非空白字符的行
四、找出"netstat -tan」命令的結果中,以‘LISTEN’後跟0或多個空白字符結尾的行;
五、找出"fdisk -l「命令的結果中,包含以/dev/後跟sd或hd及一個字母的行;
六、找出」ldd /usr/bin/cat「命令的結果中文件路徑;
七、找出/proc/meminfo文件中,全部以大寫或小寫s開頭的行;至少用三種方式實現;
八、顯示當前系統上root、centos或spark用戶的相關信息;
九、echo輸出一個絕對路徑,使用egrep取出其基名;
十、找出ifconfig命令結果中的1-255之間的整數;