天天看點

正規表達式解析_學習筆記

時間:2017.11.20

作者:李強

參考:man,info,magedu講義

聲明:以下英文純屬個人翻譯,英文B級,歡迎糾正,以下内容純屬個人了解,并沒有對錯,隻是參考,盜版不糾,才能有限,希望不誤人子弟為好。

1、使用目的與場景

一些指令都會使用到查詢和比對一些東西的時候,而正規表達式的過濾功能就可以被調用。

比如grep,find -regex ,vi ,等

2、官方說明

grep: Global search REgular expression and Print out the line 

作用:文本搜尋工具,根據使用者指定的“模式”對目标文 本逐行進行比對檢查;列印比對到的行 

模式:由正規表達式字元及文本字元所編寫的過濾條件

3、寫在前面

通配符是用來比對檔案名時使用的,在指令裡一般都可以使用比如ls,grep的參數file都可以是用通配符表示

正規表達式是針對字元使用的,但是正規表達式在ls裡就沒法使用,

使用正規表達式的工具有grep,sed,awk,wim,less,Nginx,varnish等

正規表達式(regular expressions)有:基本正規表達式BRE;擴充正規表達式ERE

正規表達式中有元字元的概念,

元字元分類:字元比對,比對次數,位置錨定,分組

man 7 regex    regular expressions正規表達式

man 7 glob 通配符

4、涉及檔案及變量

5、用法

<code>NAME</code>

<code>       </code><code>grep</code><code>, </code><code>egrep</code><code>, </code><code>fgrep</code> <code>- print lines matching a pattern</code>

<code>SYNOPSIS</code>

<code>       </code><code>grep</code> <code>[OPTIONS] PATTERN [FILE...]</code>

<code>       </code><code>grep</code> <code>[OPTIONS] [-e PATTERN | -f FILE] [FILE...]</code>

這個FILE可以是好多種的檔案,比如dpdc,-r 還可以用glob來表示。

我覺得了解這個概念,可以在此處放一個windows下的查找替換功能的視窗。

你想要什麼操作就是option選項,你想要過濾什麼内容就用正規表達式( ERE|BRE )

感覺正規表達式就像管道,左邊進右邊出,一次輸入一行内容,然後根據比對條件,

一個字元一個字元找,找到了比對條件,取出字元,print為一行,然後再去比對,取出字元,print為一行

grep 參數表

Matcher Selection:

-E

egrep-Ffgerp-G(預設)使用BRE-P

Matching Control:-e

-e可以跟多個pattern,各個pattern之間待驗證。

另外就是可以查找-開始的字元不會當做參數操作而是當做pattern,而不用去加引号轉義符\-

 -f從檔案中擷取patterns模式,每行一個-i忽略大小寫-w

--word-regexp 輸出指定詞組的行,詞組成成分是字母數字和下劃線

,如果有其他特殊字元也會比對這個要注意使用的場景,最好加雙引号 “” ,\用[\]表示,()用\(\),具體還要分析

-v反轉比對的結果,選擇非比對行列印出來

-x--line-regexp 隻選擇那些與整行完全比對的比對項-y已過時的選項,-i的同義詞

  General Output Control:

-c禁止正常輸出;相反,為每個輸入檔案列印比對行計數。

--color=auto,always,never 預設auto-L找出來那個檔案裡不存在比對的内容就列印出檔案名可以被管道符當stdin使用-l和-L相反,列印出存在比對的内容的檔案名,可以被管道符當stdin使用-m最多隻顯示出查找到的幾行,并不都顯示出來。-o

隻列印比對行的比對部分(非空部分),将每個此類部分放在單獨的輸出行上

。比如我想知道/etc/passwd 一共有多少個bash字元,那麼就可以使用這個選項然後uniq -c 

-q如果成功不輸出到STDOUT,但是錯誤會顯示錯誤資訊。這裡也是&gt;是沒用的,2&gt;可以-s不管對錯都不輸出任何資訊。注意的是不輸出任何資訊,&gt; 2&gt; 并沒有作用

Output Line Prefix Control:-b對于檔案行首開始,每個比對項到行首的位置,第32個字元,第65個字元之類的,好像

-H(預設)當有多個搜尋檔案存在時,列印每個檔案名-h(預設)單隻搜尋一個檔案時,不列印檔案名

-n列印檔案中比對的行,并且将檔案中是哪行的行号也一起列印-T看不懂,方正加了之後格式就不會因為Hnb參數改變了

-u

-z也看不懂,-lz然後“”print(.*)“”然後輸出結果,列印出檔案名,說明在檔案中比對到了,可以跨行來查找好像。

 Context Line Control:(參數後跟數字)-A--after-context=NUM 列印比對行并且往後顯示多少行

-B--before-context=NUM  列印比對行并且往前顯示多少行-C--context=NUM 列印比對行并且上下顯示多少行

File and Directory Selection-a

-H

-D

-d

 --exclude=GLOB

--exclude-from=FILE

--include=GLOB

 --exclude-dir=DIR-r如果grep跟的是目錄那麼遞歸去查詢目錄下的所有檔案是否包含pattern内容。-R

字元比對:

字元比對怎麼比對一個字元串string不是characters,

預設比如寫abc就是比對包含有abc這個字元串的行

.

比對任意單個字元

[]

比對指定範圍内的任意單個字元

[^]

取反的意思

字元類character class

[:alnum:]

字母和數字

[:alpha:]

代表任何英文大小寫字元,亦即 A-Z, a-z

[:lower:]

小寫字母

[:upper:]

大寫字母

[:blank:]

空白字元(空格和字元)

[:space:]

水準和垂直的空白字元(比[:blank:]包含的範圍廣)

[:cntrl:]

不可列印的控制字元(倒退、删除、警鈴、、、)

[:digit:]

十進制數字

[:xdigit:]

十六進制數字

[:graph:]

可列印的非空白字元

[:print:]

可列印字元

[:punct:]

标點符号

注意:-w,比對單詞時一定要注意的,預設不使用正規表達式的字元不加選項,

表示查找比對包含這個字元串的行

比對次數:

用在要指定次數的字元後面,用于指定前面的字 符要出現的次數 

*

比對前面的字元任意次,注意這裡隻是前面的字元,任意次就是0-∞

\?

比對前面的字元0或者1次,0|1

\+

比對前面的字元至少1次,1-∞

\{n\}

比對前面的字元n次

\{n,\}

比對前面的字元至少n次

\{,m\}

比對前面的字元最多m次

\{n,m\}

比對前面的字元至少n次,最多m次

位置錨定:

行位置錨定

^

行首

$

行尾

^$比對空行,^[[:space:]]*$比對非空空白行

單詞位置錨定

\&lt;

詞首

\&gt;

詞尾

\b

詞起始位

\&lt;pattern\&gt;或者\bpattern\b但是因為有b這個單詞是以還是\&lt;\&gt;适用廣些

分組,後向引用,或

\(\)

将一個或多個字元捆綁在一起,當作一個整體進 行處理,如:\(root\)\+

後向引用

後面使用\1 \2來調用前面的第幾個\(pattern1\)比對到的字元,從左往右數,第幾個小括号就是幾

\|

字元或之間的關系,例如a\|b  a或b     C\|cat   C或cat   \(C\|c\)at     Cat或cat  

6、實際應用分析

1、這裡PATTERN什麼時候使用單引号和雙引号和反向單引号呢

總之用雙引号然後遇到需要轉義的字元就加\,反向單引号用來調用指令,和平時查不多,最好不用單引号

2、如果要使用特殊字元本身

用轉義字元表示

? 表示重複比對0次或1次\?

+   表示重複比對1次以上\+

[]   表示比對[]裡的任意單個字元

{}   表示這個{}要用\字元去轉義 \{ \}

其他和正常一樣寫{n}{n,}{,m}{n,m}差不多的寫法,不同的是這裡表達的含義是比對的次數而已

{n}表示的就是比對n次,{n,}表示比對至少n次,{,m}表示比對最多m次,{n,m}表示比對次數最少n次,最多m次。

()

這個東西在正規表達式就是如上\(   \) ,

然後在grep中對這個有個操作是會把()比對的字元當做是一個變量從前往後1,2,.....,

可以用\1 \2去調用第幾個()比對的字元

|

表示或者的意思,也要用\轉義,就是\|

\(a\|b\) 代表意思就是a或者b

因為 ? + {}()需要被轉義,是以正常使用就是說的這個字元本身了。

相反\  *  - [] 不需要被轉義,如果要使用需要用\轉義來代表本身 \\ \*  \[\]

因為. 有含義,是以使用.需要被轉義\.

3、grep和egrep的差別

加了轉義字元\,好麻煩,是以egrep

egrep和grep差別在于不用\來轉義{} () ? + |

4、pattern的一些組合

[lq@centos6 ~]$ifconfig | egrep -o  "\&lt;([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-2][0-2])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\&gt;"

主機可用IP位址:1-223|0-255|0-255|1-254,[]()\.等的組合用法

本文轉自 lajifeiwomoshu 51CTO部落格,原文連結:http://blog.51cto.com/lajifeiwomoshu/1983678

繼續閱讀