grep正則表達式詳解及練習

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搜索以後,自動高亮顯示所匹配字符。

wKioL1berP7i4x55AAAQwWB2L4g367.png

CentOS7定義了grep別名alias grep=’grep--color=auto’

wKiom1berPySio10AAAGyykQcQg733.png

-i:忽略字符大小寫

wKiom1beraqCvSqOAAAfX9XcIyI420.png

-o:僅輸出文件中匹配到的部分

wKioL1bermjQRV8UAAARprFDazM249.png

-v:反向查找,輸出文件中不匹配的行。

wKiom1beriHj0OdbAAAfBbKMDFc210.png

-q:進入靜默模式,該模式下,grep命令運行目的僅僅是執行一個條件測試,一般在腳本中使用,經過檢查其返回值進行下一步操做。

wKiom1berkvCBF95AAATs3UJUV0901.png

經常使用選項二:

-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匹配到的字符串,從左側起,第二個左括號及與之匹配的右括號內模式匹配到的內容。

後向引用:引用前面括號中的模式所匹配到的字符

wKioL1betCDQ2e1yAAAUPMQ0U58608.png

輸出結果中行首字符跟行尾字符相同(行尾引用了行首匹配到內容)。

四、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結尾的行;

wKioL1beuEfRb6DuAAAaEWLukBM741.png

二、找出/etc/passwd文件中的三位或四位數;

wKioL1beuFfwFzR9AACIG0zmzqM308.png


三、找出/etc/grub2.cfg文件中,以致少一個空白字符開頭,後面又跟了非空白字符的行

wKiom1bet-zSGRsZAAA6E08H-co699.png

四、找出"netstat  -tan」命令的結果中,以‘LISTEN’後跟0或多個空白字符結尾的行;

wKioL1beuIGA39KaAAAiYP-1Yks284.png

五、找出"fdisk  -l「命令的結果中,包含以/dev/後跟sd或hd及一個字母的行;

wKiom1beuA6x_3N8AAAR9z9Ij1Q254.png

六、找出」ldd  /usr/bin/cat「命令的結果中文件路徑;

wKiom1beyQbxd1K1AAAfACC_LlU696.png

七、找出/proc/meminfo文件中,全部以大寫或小寫s開頭的行;至少用三種方式實現;wKiom1cEVrTBXBvcAABeslKlBVQ158.png

八、顯示當前系統上root、centos或spark用戶的相關信息;

wKiom1beuFKyyCgdAAAaq2qxjlA411.png

九、echo輸出一個絕對路徑,使用egrep取出其基名;

wKiom1bev3mA9xCfAAAKzLRBbyc864.png

十、找出ifconfig命令結果中的1-255之間的整數;

wKioL1bewA-B5WilAABRigi2DKM558.png

十一、找出系統中其用戶名與shell名相同的用戶。wKioL1bewEqh2B9GAAAVkXyKmcc409.png

相關文章
相關標籤/搜索