正則表達式: 計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器裏,正則表達式通常被用來檢索、替換那些符合某個模式的文本。
正則表達式由兩類組成:
基本正則表達式與擴展正則表達式
基本正則表達式:
字符匹配
.:匹配單個字符
[]:匹配指定集合中的任意單個字符
[:digit:]:所有數字(0-9)
[:lower:]:所有小寫字母(a-z)
[:upper:]:所有大寫字母(A-Z)
[:space:]:空白符
[:punct:]:特殊字符
[:alpha:]:所有字母(包含大寫字母)
[:alnum:]:包含數字以及大小寫字母
[^]:匹配指定集合外的任意單個字符
匹配次數:用於對其前面近鄰的字符所能夠出現的次數做出限定
*:匹配前面的字符任意次(0,1,.......,N)
\+:匹配前面出現的字符至少一次
\?:匹配前面出現的字符一次或0次
\{m\}:匹配前面出現的字符m次(用戶定義)
\{m,n\}:匹配前面的字符最少m次最多n次(用戶定義)
.*:任意長度中的任意字符
位置錨定
^:行首鎖定
$:行尾鎖定
^$:空白行
\<:詞首鎖定(要查找的內容的左側:\<用戶定義)
\>:詞尾鎖定(要查找的內容的右側:用戶定義\>)
\<\>:匹配單詞
分組
\(\)具有向後引用功能:搜索的內容中,如果使用\(\)進行了分組,程序會在某行文本中檢查用戶定義的內容,那麼在此後面的內容中可直接引用:\#(引用第幾個左括號以及其匹配的右括號之間的模式如:\(\(\)\) 如果想使用裏面分組的內容則使用\2即可)
擴展正則表達式:
這裏只做與基本正則表達式不同的擴展表達式
匹配字數限定:
?:前面的字符0次或1次
+:前面的字符至少一次
{m}:前面的字符m次
{m,n}:至少m次,至多n次
分組()支持向後引用\1 .....\n
“或“
a|b a或b
ab|cd ab或cd
a(b|c)d abd或acd
以下爲示例:
0x04:
顯示/proc/cpuinfo文件中以c開頭的所有行內容
方法:
“grep ‘^c’ /proc/cpuinfo ”
“egrep '^c' /proc/cpuinfo ”
效果圖:
解析:
c開頭那麼就要鎖定行首使用^即可
0x05:
顯示/etc/rc.d/rc.sysinit文件中,以#開頭並且後面至少跟一個空白字符,並且空白字符後又跟一個非空白字符的字符並且行尾以.結尾
方法:
" grep '^#[[:space:]]\+[^[:space:]].*\.$' /etc/rc.d/rc.sysinit "
" egrep'^#[[:space:]][^[:space:]].*\.$' /etc/rc.d/rc.sysinit "
效果圖:
解析:
以#開頭那麼就鎖定行首使用^然後#後面需要跟一個空白字符並且至少出現一次那麼就使用[[:space:]]\+接下來這個空白字符後又跟一個非空白字符那麼就使用[^[:space:]](在[:space:]前加個^即可)最後就剩下以.結尾
如果我們直接輸入\.的話並不會輸出任何內容因爲這個文件中並沒有內容爲”#空白字符^空白字符.這種類型的行”我們必須在\.前面加.*任意長度的任意字符並且在\.後加$以.結尾
注:這裏的.用\.表示是因爲正則表達式中單個.表示匹配單個的任意字符所以我們需要用\來將它轉義爲”.”這個標點符號
0x06:
顯示/etc/passwd文件中的所有3位數並且找出當前用戶名爲4個字符並且shell與其相同
方法:
" grep '[[:digit:]]\{3\}' /etc/passwd | grep '\(\<[[:alnum:]]\+\>\).*\1$' "
" egrep'[[:digit:]]{3}' /etc/passwd | egrep '(\<[[:alnum:]]+\>).*\1$' "
效果圖:
解析:
剛看題目可能有點暈感覺無從下手,我們可以一步一步過濾先顯示出所有的3位數。使用[[:digit:]]顯示所有數字(可使用[0-9]代替)然後是3位數肯定要顯示三次如果我們不加\{3\}的話那麼就會顯示passwd中所有的數字到了這一步我們就已經完成一半了
接下來顯示用戶名與此行最後一個字符串相同的行,我們必須再次過濾內容。首先用戶名有可能有數字但是默認shell是沒有數字的所以我們不需要使用[:alnum:]這個正則表達式而用[:alpha:],然後用戶名是一個字符串(可以看做是一個單詞)所以使用單詞匹配\<\>既然是單詞那麼最少要出現一次使用\+,要顯示行的內容那麼就需要加.*因爲用戶名和shell中間有許多內容
剩下還有一個分組和向後引用,我們需要用戶名和shell相同那麼就可以把用戶分爲一個組如果不加向後引用那麼就會匹配與用戶名相同的字母結尾所以我們向後引用一次\1並且加個$以與用戶名相同的內容結尾結尾。
附加練習:
新建一個文本使用正則表達式顯示文本中的ip地址(ip範圍:1.0.0.1-223.255.255.224)如果方法正確則不會顯示這個ip範圍外的任何ip地址
注:ip第四段如果是一位數字那麼不能爲0如果是3位數字不能爲255
實現方法:
" ifconfig| egrep'\<(\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|2[2][0-3])\>)\.((\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|2[5][0-5])\>)\.){2}(\<[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|2[5][0-4]\>)\>' 1 " (這裏我用的文件名爲1可自行更改)
效果圖:
這裏並沒有給出解析如果小夥伴們可以自己分析爲什麼這麼做的話那麼以上的正則表達式就會的差不多了。
目測有小夥伴已經暈了,我個人的表達能力不強在這裏表示抱歉。正則表達式其實也不難首先要記住每個正則表達式所對應的內容然後再理解題目中的意思而正確使用相應的表達式即可完成操作。
可能剛開始記憶正則表達式比較困難,可以先選擇記憶擴展型的正則表達式,因爲基本正則表達式大部分需要轉義所以使用起來和記憶起來可能會有點混亂,尤其是當基本正則表達特別多的情況下儘量寫一步執行一步不然最後執行如果出錯的話會特別難排錯。