希望各位不要白piao,點個贊或者刷個評論再走,還有【禁止轉載】,抄襲轉載必究,謝謝合作。
本篇文章主要講了shell中的正則表達式的用法,如果不懂正則在其他命令中的使用,請在我的博文裏面搜索你要的命令,我都有講。如果會了可以忽略本文章,省下時間去學習別的知識~如果你已經知道了正則相關知識,想知道shell怎麼進行簡單的數據處理請移步shell三大常用數據處理命令的博文:
grep實戰指南
awk實戰指南
sed實戰指南
----------------------文章概述----------------------
- 如何看文檔
- 常見符號解釋
- 數量限定符
- 位置限定符
- 其他特殊字符
--------------------------------------------------------
至於正則表達式是什麼,我就不多說了,如果真的有這個都不知道的我覺得你應該先去百度一下再來論壇看文章。我們直接說正則表達式的語法
如何看文檔
這裏我再說一下如果你不知道命令的具體用法怎麼辦,你首先想到的一定是通過man 你要查詢的命令
去看文檔。如果你想在這條路上走的遠,你就得有文檔閱讀能力,這是必須要有的能力,英文看不懂?學。程序員不需要學習,機械工作就好。程序工程師可不是機械的工作,你要改變世界的,奧利給~~~~
常見符號解釋
匹配符 | 含義 |
---|---|
. | 匹配任意一個字符 abc.可以匹配abcd、abc9等 |
[ ] | 匹配括號中的任意一個字符 [abc]d可以匹配ad、bd或cd |
- | 在[ ]括號內表示字符範圍 [0-9a-fA-F]可以匹配一位十六進制數字 |
^ | 位於[ ]括號內的開頭,匹配除括號中的字符之外的任意一個字符 [^xy]匹配除xy之外的任一字符,因此[^xy]1可以匹配a1、b1但不匹配x1、y1 |
[ [ :xxx: ] ] | grep工具預定義的一些命名字符類 [ [ :alpha: ] ]匹配一個字母,[ [ :digit: ] ]匹配一個數字 |
數量限定符
常用的有以下幾種:
?
緊跟在它前面的單元應匹配零次或一次[0-9]?\.[0-9]
匹配0.0、2.3、.5等,由於.
在正則表達式中是一個特殊字符,所以需要用\
轉義一下- 取字面值
+
緊跟在它前面的單元應匹配一次或多次[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z0-9_.-]+
匹配email地址 *
緊跟在它前面的單元應匹配零次或多次[0-9][0-9]*
匹配至少一位數字,等價於[0-9]+,[a-zA-Z_]+[a-zA-Z_0-9]*
{N}
緊跟在它前面的單元應精確匹配N次[1-9][0-9]{2}
匹配從100到999的整數{N,}
緊跟在它前面的單元應匹配至少N次 (這跟第4條是不一樣的這裏多個,
號)[1-9][0-9]{2,}
匹配三位以上(含三位)的整數{,M}
緊跟在它前面的單元應匹配最多M次[0-9]{,1}
相當於[0-9]?{N,M}
緊跟在它前面的單元應匹配至少N次,最多M次[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
匹配IP地址 (這個地方其實有個坑這個是有的意思 不是有且只有,這個地方很重要,我自己就被坑過)
再次注意grep找的是包含某一模式的行,而不是完全匹配某一模式的行。再舉個例子,如果文本文件的內容是
aaabc
aad
efg
查找a*這個模式的結果是三行都被找出來了
egrep 'a*' testfile
運行結果爲:
aabc
aad
efg
a匹配0個或多個a,而第三行包含0個a,所以也包含了這一模式。單獨用a這樣的正則表達式做查找沒什麼意義,一般是把a*
作爲正則表達式的一部分來用。(*
緊跟在它前面的單元應匹配零次或多次)
位置限定符
字符 含義 舉例
^ 匹配行首的位置 ^Content匹配位於一行開頭的Content
$ 匹配行末的位置 ;$匹配位於一行結尾的;號,^$匹配空行
\< 匹配單詞開頭的位置 \<th匹配... this,但不匹配ethernet、tenth
\> 匹配單詞結尾的位置 p\>匹配leap ...,但不匹配parent、sleepy
\b 匹配單詞開頭或結尾的位置 \bat\b匹配... at ...,但不匹配cat、atexit、batch
\B 匹配非單詞開頭和結尾的位置 \Bat\B匹配battery,但不匹配... attend、hat ...
位置限定符可以幫助grep更準確地查找
【Case1】:用[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}
查找IP地址
運行結果如下:
192.168.1.1
1234.234.04.5678
【Case2】:\^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$
查找
運行結果爲:
1234.234.04.5678這一行過濾掉了。因爲有了``$`符號
其它特殊字符
字符 | 含義 | 舉例 |
---|---|---|
\ | 轉義字符,普通字符轉義爲特殊字符,特殊字符轉義爲普通字符 | 普通字符<寫成<表示單詞開頭的位置,特殊字符.寫成.以及\寫成\就當作普通字符來匹配 |
() | 將正則表達式的一部分括起來組成一個單元,可以對整個單元使用數量限定符 | ([0-9]{1,3}.){3}[0-9]{1,3}匹配IP地址 |
| 連接兩個子表達式,表示或的關係 | n(o | either)匹配no或neither |
以上介紹的是grep正則表達式的Extended規範,Basic規範也有這些語法,只是字符?+{}|()
應解釋爲普通字符,要表示上述特殊含義則需要加\轉義。如果用grep而不是egrep,並且不加-E參數,則應該遵照Basic規範來寫正則表達式。
如果是上面的這段話理解不了不用理解了,反正你在工作的時候egrep不好用就直接使用grep -E
對吧,有些東西我們需要較真有些東西真沒必要,對於無關事務的過於較真就叫槓精