grep與正則表達式

回顧:

         bash的特性:hash,變量

                   命令:hashhash命令

                   變量:

                            本地變量,環境變量,局部變量

                            位置參數變量,特殊變量

                           

                            變量賦值:name=valueexportname=valuedeclare -x name=value

                            變量引用:$name${name}

                                     有些時候,變量的引用時用${name},即大括號是不能省略的,

                                               演示:

                                                        [root@centos6 ~]#animal=sheep

                                                        [root@centos6~]# echo $animal

                                                        sheep

                                                        [root@centos6~]# echo "these is$animals"

                                                        theseis

                                                        [root@centos6~]# echo "these is${animal}s"   //我們希望將                                                                                      sheep編程複數,所以這時候就需要加上大括號。

                                                        theseis sheeps

                                                        [root@centos6~]#

 

                            撤銷:unset name

        

        

         (變量的聲明,他的作用域僅僅是作用在當前的shell進程,對於環境變量而言,他的作用於也僅僅是作用在當前的shell及其子進程上,如果我們現在的進程終止了,我們還需要啓動一個進程,依然想讓它有效,則需要編輯配置文件來實現,需要定義在配置文件中,)

         bash腳本編程,運行腳本

                   運行腳本:

                            1)給腳本執行權限,然後運行

                            2)直接手動使用bash解釋器,將腳本作爲bash的參數來運行

                   編寫腳本編程標準:

                            1)第一行必須要頂格寫,#!/bin/bash

                            2)在腳本中的所有的“#”都被註釋掉。所有的空白行也會被註釋掉

                            3)建議在腳本編寫過程中,分段時我們空幾行,可以提高閱讀

         bash的配置文件

                   profile類:登錄式shell提供

                            登錄式shell

                                     使用 su - 或使用 su -l 或者通過終端直接登錄的用戶,

                   bashrc類:非登錄式shell提供

                                     使用su切換時,中間沒有加“-”或“-l”選項,在圖形環境下,使用命令行接口,shell腳本運行時運行的shell進程,

 

         登錄式shell運行時,讀取的配置文件的路徑順序:

/etc/profile------>/etc/profile.d/*.sh------->~/.bash_profile--------->~/.bashrc--------->/etc/bashrc

         非登錄式shell運行時,讀取的配置文件的路徑順序:

~/.bashrc-------->/etc/bashrc-------->/etc/profile.d/*.sh

 

         profile類的配置文件主要用於實現定義環境變量,或定義運行的命令或腳本

         bashrc類的配置文件主要用於定義本地變量和命令別名。

 

 

文本處理工具:

 

         Linux上的文本處理三劍客:

                   grep:文本過濾工具(以模式進行過濾:pattern)工具:

                   sedstream  editor,流編輯器;所以說sed是文本編輯器;

                   awkLinux上的實現爲gawk,文本報告生成器(即:格式華文本);

                             

         正則表達式:Regual Expressiion 簡寫爲:REGEXP

                   文本處理三劍客,都會用到正則表達式。

                   定義:

                            由一類特殊字符文本字符所編寫的模式,其中有些字符不表示其字面意義,                         而是用於表示控制或通配的功能;像這樣的組合我們就稱之爲“正則表達式”                                                                                           

                  正則表達式分爲兩類:

                            基本正則表達式:BRE

                            擴展正則表達式:ERE

                                     兩者不同的地方就是他們的元字符不同

 

                   元字符:表示這種字符不會再被切割,而且是用於通配或者是控制的功能。

                            基本正則表達式的元字符與擴展正則表達式的元字符還是不一樣的。

 

         舉例:

                   我們要匹配找到一個單詞連續出現三次,寫一個模式: hello”單詞至少出現三次,並且後面還帶有空格的,這個空格至少出現一次,然後由“hello和空格組成的模式,還可以在文本中出現n次,那麼悶應該怎樣寫:

                            解:  \(hello[[:space:]]\+\)\+

 

         正則表達式的出現,是計算機得以智能化的非常重要的科學工具。

                   計算機存儲的數據,一般爲兩類:文本類,數值類

 

 

grep工具:

 

grep:全稱:Global searchREgular expression and Print out the line.

         作用:全面的搜索文本文件的工具,根據用戶指定的“模式”(過濾條件)對目標文本逐行進程匹配檢查;打印出匹配到的一整行而不是僅僅打印匹配到的模式本身

 

         模式:由正則表達式的元字符文本字符所編寫出的過濾條件

 

         每一個正則表達式的模式的實現,都要用到正則表達式的引擎,也稱爲正則表達式處理器,就像grep工具,之所以能夠根據模式來過濾文本,就是grep工具本身自帶了“正則表達式的引擎工具”不同的正則表達式的引擎所能支持的元字符,支持的正則表達式的種類,無論是基本的還是擴展的都是不一樣的。

         就連grepsedawk這三個工具他們內置的正則表達式引擎也是不一樣的。

 

正則表達式引擎:

 

         grep [OPTIONS] PATTERN [FILE].....   //解釋:grep命令字,後加選項,PATTERN是我們                                                                                    自己編寫的查找條件,也就是模式;FILE是指我們                                                                           要對哪個文件進行過濾

         grep[OPTIONS] [-e PATTERN] -f FILE (FILE............)  //加上選項“-e”表示可以寫多個查找                                                                                              條件,加上選項“-f”表示我們可以將模                                                                                               式寫在一個文件中,然後讀取這個文件來                                                                                                  對後面的括號中的目標文件進行過濾查                                                                                                 

 

         OPTIONS(選項):

                   --color=auto對匹配到的文本着色後高亮顯示(默認是紅色,但是我們也可以將這                                        個顏色改爲其他的顏色.)

                   -iignorecase,忽略字符大小寫;

                   -o:僅顯示匹配到的字符串本身;

                   -V,--invert-match:顯示不能被模式匹配到的行;

                   -E:支持使用擴展的正則表達式元字符;

                   -q,--quiet,--silent:靜默模式,既不輸出任何信息;

                   -A#after,#行(#:表示一個數字)

                   -B#before,前#

                   -C#context,前後各#

                   -E:支持使用擴產一表達式

 

基本正則表達式元字符:

         字符匹配

                   .:一個點號,匹配任意單個字符;

                   []:匹配指定範圍內的任意單個字符;

                   [^]:匹配指定範圍之外的任意單個字符;        

            [:digit:] [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]

         注意:我們在使用上面的待碼時,我們還需要在外面加上範圍符號“[]”。

練習:

         1)在文件/etc/passwd中匹配rt之間有兩個任意字母的行:

                   [root@centos6~]# grep"r[[:alpha:]][[:alpha:]]t" /etc/passwd

                   root:x:0:0:root:/root:/bin/bash

                   operator:x:11:0:operator:/root:/sbin/nologin

                   [root@centos6~]#

         2)在文件/etc/fstab中匹配出現“UUID”的行:

                   [root@centos6~]# grep "UUID"/etc/fstab   //模式可以不加雙引號,因爲是字符串

                   UUID=2ead7599-15b0-4b11-b96d-5f9b59e2e7eb/                       ext4                defaults        1 1

                   UUID=edb28e3e-5ee7-400f-8226-fab5fa157188/boot                   ext4                  defaults        1 2

                   UUID=32376552-a128-416d-be08-0aa6acab4661/testdir                ext4                   defaults        1 2

                   UUID=091e5b14-8201-4ffc-9278-41b7acae00d9swap                    swap              defaults        0 0

                   [root@centos6~]#

上面我們匹配“UUID”時,UUID顯示爲紅色,是高亮顯示,是因爲我們定義了grep的高亮顯示別名:“alias grep='grep  --color=auto'”這是centOS6centOS7的不同,6系統沒有自定義這個別名,而7上定義了,我們可以在centOS6上自行定義

         3[root@centos6~]# grep -o UUID /etc/fstab   //僅顯示匹配到的字符串本身內容

                   UUID

                   UUID

                   UUID

                   UUID

                   [root@centos6~]#

         4[root@centos6~]# grep -q UUID /etc/fstab   //作用就是我們可以根據匹配到或者                                                                                                           匹配不到的結果,來知道沒有這個信息

                   [root@centos6~]# echo $?

                   0

                   [root@centos6~]# grep -q UUIID /etc/fstab

                   [root@centos6~]# echo $?

                   1

                   [root@centos6~]#

         上面選項“-q”的作用:我們以後可以根據grep是否執行正常的結果。可以當做一種判斷條件,我們並不關心grep執行的結果,我們只關心grep執行的狀態結果時,我們就可以用“-q”選項了

 

         匹配次數:

                   用在要指定其出現的次數的字符的後面,用於限制其前面字符出現的次數;默認工作在貪婪模式下

         *:匹配其前面的字符任意次0,1次或任意次;

         練習:

                   grep"x*y"

                            符合條件的有:abxyabyxxxxxyyab

         .*:匹配任意長度的任意字符(相當於glob*,匹配任意長度的任意字符,並且正則表達式默認工作在貪婪模式,能匹配多長就匹配多長。)

         練習:

                   grep"r.*"  /etc/passwd

                            wKioL1gytIiiVc_9AAIohkxYN5c745.png

注意:正則表達式的模式時,一般要加上雙引號。

 

                  \?:匹配其前面的字符0次或1次;即前面的字符是可有可無的;

                  \+:匹配前面的字符1次或多次,即其前面的字符要出現至少一次;

                  \{m\}:匹配其前面的字符m次;(精確次數匹配)

                  \{m,n\}:匹配其前面的字符至少m次,至多n次;

                            \{0,n\}:匹配其前面的字符最多n次;

                            \{m,\}:匹配其前面的字符最少m次;

 

         位置錨定:

                   ^:行首錨定;用於模式的最左側;

                   $:行尾錨定,用於模式的最右側;

                   ^PATTERN$:用於PATTERN來匹配整行;

                            ^$:空白行;(連空格也不能包含的空行)

                            ^[[:space:]]*$:空行或包含空白字符的行;

 

                   單詞:非特殊字符所組成的連續字符(字符串)都成爲單詞;

                   \<\b:詞首錨定,用於單詞模式的左側;

                   \>\b:詞尾錨定,用於單詞模式的右側;

                   \<PATTERN\>:匹配完成單詞;

 

 

 

 

 

練習:

         1)顯示/etc/passwd文件中不以/bin/bash結尾的行;

                           [root@centos6~]# grep -v"/bin/bash$" /etc/passwd

 

         2)找出/etc/passwd文件中兩位數或三位數;

                            錯誤的寫法:[root@centos6 ~]# grep"[[:digit:]]\{2,3\}" /etc/passwd

                            正確的寫法:[root@centos6 ~]# grep"\<[[:digit:]]\{2,3\}\>" /etc/passwd

                                               或:[root@centos6 ~]# grep"\<[0-9]\{2,3\}\>" /etc/passwd

         總結:這裏當匹配確定的幾位數時,我們一定要錨定開頭和結尾,因爲,不錨定的話,                            五位數,六位數,等等它都包含三位數。

 

         3)找出/etc/rc.d/rc.sysinit/etc/grub2.cfg文件中,以至少一個空白字符開頭,且後面非空白字符的行;       

                   錯誤的寫法:grep -v '[[:space:]]$'/etc/rc.d/rc.sysinit | grep '^[[:space:]]\+'

                   正確的寫法:[root@centos6 ~]# grep"^[[:space:]]\+[^[:space:]]" /etc/rc.d/rc.sysinit

 

         4)找出“netstat-tan”命令的結果中以“LISTEN”後跟0,1,或多個空白字符結尾的行;

         分組及引用:

                   錯誤的寫法:[root@centos6~]# netstat -tan | grep "LISTEN[[:space:]].*$"

                   正確的寫法:[root@centos6~]# netstat -tan | grep"LISTEN[[:space:]]*$"

 

 

        

         xy*ab這表示什麼意思?

                   表示前面的y能夠出現0次,1次,多多次,跟x是沒有關係的;

         問題:如果想讓上面的xy組成一個整體,然後讓這個整體出現1次,0次,或多次;

                   解:

                            那就需要將xy括起來,將其看做一個整體單位來描述,但是在bash命令行中括號是有特殊意義的,所以這裏我們需要用轉義字符;即要寫爲:\(xy\)*ab,類似於這樣的就叫做分組;

 

 

分組及引用:

 

         \(\):將一個或多個字符捆綁在一起,當作一個整體進行處理;

                   例如:\(xy\)*ab

         Note(注意):分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄於內部的                                        變量中,這些變量爲:

                                     \1:模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹                                    配到的字符;

                                     \2

                                     \3

                                     ........

         解釋:如果我們有多個括號的話,那麼第一個括號所匹配到的內容可以被後面再次引用

         舉例說明:

                   例一:

                   一個文件中有以下內容:

                   Heloves his lover.

                   Helikes his lover.

                   Shelikes her liker.

                   Sheloves her liker.

                   現在要求我們找出這個文件中前後出現兩個一樣的字符串的行,比如說“He loves                    hislover.”行中有兩個love字符串。

 

         第一步:

                   我們先建立一個名爲“lovers.txt”文件,將上面內容複製過去。

                   我們用nano命令時,我們寫完後,先按回車鍵,然後再按ctrl+x退出。

                   [root@centos6~]# nano lovers.txt

         第二步:

                   進行查找:

                   但是我們如果用這個命令查找的話會出現下面的現象:

                   [root@centos6~]# grep "l..e.*l..e"lovers.txt

                   wKiom1gytKrBRpJ4AAAWQ2Be598328.png

                   上面的查找結果顯然不符合要求,因爲我們要查找的是,前面是like,後面也是like                  或者前面是love後面也必須是love,那麼這時我們應該怎麼辦?

                   [root@centos6~]# grep"\(l..e\).*\1" lovers.txt    //這就是後向引用。

                   wKiom1gytMWzhF0PAAA5ojIDJGg877.png

 

                   例二:

                            我們要找出文件“/etc/passwd”中行首出現root,行中也出現root的行:

 

                   解:

                            [root@centos6~]# grep"\(r..t\).*\1" /etc/passwd

                            wKiom1gytOLC9ZKgAAAOqrXTydQ183.png

 

         後向引用:引用前面的分組括號中的模式所匹配到的字符;括起來後也可以不引用。

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章