linux三劍客之grep

linux三劍客之grep

       所謂三劍客的工具有“grep”、“sed” 、“awk”,他們都是不謀而合的文本搜索查找處理的強大工具。grep 是 Ken Thompson 寫的,他也是 Unix 的創造者。

gerp及正則表達式

   grep全稱(GLobal search Regular expression and print out the line   全局搜索正則表達式并打印到命令行)

   grep是文本搜索工具,根據用戶指定的“模式”(過濾條件),對目標文本逐行進行匹配并打印到命令行界面

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

grep又分為grep、egrep、fgrep;其中grep支持基本正則表達式,egrep支持擴展正則表達式,fgrep則不支持正則表達式;至于為什么要分的那么多,因為linux系統上有很多工具,而有的工具只支持基本正則表達式進行搜索,有的卻支持擴展正則表達式,至于fgrep則是用來匹配不用 “模式 ” 作為過濾條件的工具,fgrep的搜索速度比前兩者快很多。

grep的使用

    命令格式:

       grep [OPTIONS] PATTERN [FILE…] 

                選項          模式         查找的文件

       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

                 -e:邏輯或      -f:在文件中調用模式來匹配

      命令選項:

–color=auto :對匹配到的文本高亮顯示

             -i :忽略字符大小寫

在搜索時不區分字符的大小寫

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

搜索到匹配的字符串時只顯示字符串本身,同行的其他字符不顯示

-v:僅顯示不能被匹配到的行

顯示不能匹配到的其他行,被匹配到的不顯示

-q:靜默模式,即不輸出任何信息

用于測試,常用于在腳本中用于判斷是否能匹配,并不關心匹配到的值

-n:給匹配到的字符所在行添加行號

給匹配到的字符所在行進行標記,行號為字符所在文本中的行數

-c:統計匹配到的行的行數

計算出匹配到的字符的所有行總數,只顯示總數

-e:邏輯或

同時匹配多個條件時使用一個條件前加一個-e選項

-w:匹配的字符串為整個單詞

匹配時不以字符進行匹配,必須為單獨的一個單詞才能匹配到

-A:顯示匹配到的行的前N行(N為要顯示的行數)

顯示匹配到的行的前面幾行

-B:顯示匹配到的行的后N行(N為要顯示的行數)

顯示匹配到的行的后面幾行

-C:顯示匹配到的行的前后N行(N為要顯示的行數)

顯示匹配到的行的前面和后面幾行

-E:使用egrep進行搜索

支持擴展正則表的式進行搜索

-F:使用fgrep進行搜索

不支持正則表達式進行搜索

基本正則表達式的元字符:

用于對要匹配的字符模糊匹配,即顯示出符合模式的字符,匹配方式有:字符匹配、匹配字符次數、字符串位置錨定、分組及引用

字符匹配:

         模糊對字符進行大概的類型進行查找

. :任意單個字符

[ ]: 指定范圍內的任意單個字符

[^]:指定范圍外的任意單個字符

其中用于[]和[^]中的還有一些常用的元字符:

[:space:]     所有空格和tab鍵

[:upper:]     所有大寫字母

[:lower:]     所有小寫字母

[:alpha:]     所有大小寫字母

[:alnum:]    所有數字和大小寫字母

[:digit:]    所有數字

[:punct:]    所有標點符號

注意:如[:punct:]等是一個整體,所以使用時需在加上外圍內或范圍外的中括號

匹配次數:

      匹配要查找的字符出現過幾次

*:匹配其前面的字符任意次(0、1、多次)

.*:匹配任意長度的任意字符

\?:匹配其前面的字符0次或1次(此字符前面一個字符可有可無)

\+:匹配其前面的字符至少1次,可以多次

\{m\}:匹配其前面的字符m次

\{m,n\}:匹配其前面的字符至少m次,至多n次(包括給定的次數)

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

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

位置錨定: 

      對字符的位置進行錨定查找

          1.對行的位置進行錨定

^:  行首錨定(用于模式的最左側)

$:行尾錨定(用于模式的最右側)

^PATTERN$:用PATTERN匹配整行

^$:空白行(不包括空格字符)

^[[:space:]]$:空白行(包括空格字符的行)

          2.對要查找的單詞進行位置錨定;單詞:非特殊字符組成的字符(字符串,包括數字)

\<或\b:詞首錨定,用在單詞的最左側 

\>或\b:詞尾錨定,用在單詞的最右側

\<PATTERN\>:用于匹配整個完整單詞

注意:\b則用在要匹配單詞模式的左右則即可,在左側則為詞首,右側則為詞尾

分組及引用:

      分組:

\(\):將一個字符或多個字符捆綁在一起當做一個整體來進行處理,可以引用此前匹配到的結果

      引用:

             引用前面分組匹配到的結果;分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄在內部變量中,使用此變量即可調用保存的結果再次進行匹配。

變量則為:\1、\2、\3、\4………………

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

\2:   表示模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符

 

egrep的使用

    命令格式:

       egrep [OPTIONS] PATTERN [FILE…] 

                選項          模式         查找的文件

      命令選項:

–color=auto :對匹配到的文本高亮顯示

             -i :忽略字符大小寫

在搜索時不區分字符的大小寫

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

搜索到匹配的字符串時只顯示字符串本身,同行的其他字符不顯示

-v:僅顯示不能被匹配到的行

顯示不能匹配到的其他行,被匹配到的不顯示

-q:靜默模式,即不輸出任何信息

用于測試,常用于在腳本中用于判斷是否能匹配,并不關心匹配到的值

-n:給匹配到的字符所在行添加行號

給匹配到的字符所在行進行標記,行號為字符所在文本中的行數

-c:統計匹配到的行的行數

計算出匹配到的字符的所有行總數,只顯示總數

-w:匹配的字符串為整個單詞

匹配時不以字符進行匹配,必須為單獨的一個單詞才能匹配到

-A:顯示匹配到的行的前N行(N為要顯示的行數)

顯示匹配到的行的前面幾行

-B:顯示匹配到的行的后N行(N為要顯示的行數)

顯示匹配到的行的后面幾行

-C:顯示匹配到的行的前后N行(N為要顯示的行數)

顯示匹配到的行的前面和后面幾行

-F:使用fgrep進行搜索匹配

不支持正則表達式進行搜索

-G:使用grep進行搜索匹配

支持正則表達式進行搜索

擴展正則表達式的元字符:

用于對要匹配的字符模糊匹配,即顯示出符合模式的字符,匹配方式有:字符匹配、匹配字符次數、字符串位置錨定、分組及引用

字符匹配:

         模糊對字符進行大概的類型進行查找

. :任意單個字符

[ ]: 指定范圍內的任意單個字符

[^]:指定范圍外的任意單個字符

其中用于[]和[^]中的還有一些常用的元字符:

[:space:]     所有空格和tab鍵

[:upper:]     所有大寫字母

[:lower:]     所有小寫字母

[:alpha:]     所有大小寫字母

[:alnum:]    所有數字和大小寫字母

[:digit:]    所有數字

[:punct:]    所有標點符號

注意:如[:punct:]等是一個整體,所以使用時需在加上外圍內或范圍外的中括號

匹配次數:

      匹配要查找的字符出現過幾次

*:任意次

?:匹配其前面的字符0次或1次(此字符前面一個字符可有可無)

+:匹配其前面的字符至少1次,可以多次

{m}:匹配其前面的字符m次

{m,n}:匹配其前面的字符至少m次,至多n次(包括給定的次數)

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

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

位置錨定: 

      對字符的位置進行錨定查找

          1.對行的位置進行錨定

^:  行首錨定(用于模式的最左側)

$:行尾錨定(用于模式的最右側)

^PATTERN$:用PATTERN匹配整行

^$:空白行(不包括空格字符)

^[[:space:]]$:空白行(包括空格字符的行)

          2.對要查找的單詞進行位置錨定;單詞:非特殊字符組成的字符(字符串,包括數字)

\<或\b:詞首錨定,用在單詞的最左側 

\>或\b:詞尾錨定,用在單詞的最右側

\<PATTERN\>:用于匹配整個完整單詞

注意:\b則用在要匹配單詞模式的左右則即可,在左側則為詞首,右側則為詞尾

分組及引用:

      分組:

():將一個字符或多個字符捆綁在一起當做一個整體來進行處理,可以引用此前匹配到的結果

      引用:

             引用前面分組匹配到的結果;分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄在內部變量中,使用此變量即可調用保存的結果再次進行匹配。

變量則為:\1、\2、\3、\4………………

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

\2:   表示模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符

或:

      |    :前一個或者后一個

fgrep:不支持正則表達式元字符

當不需要用到元字符去進行匹配字符時,使用fgrep速度更快

練習題:

 1、顯示當前系統root、 mage或wang用戶的UID和默認shell

  [root@localhost /]# egrep "^(root|wang|mage)\b" /etc/passwd | cut -d: -f3,7

 2、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)后面跟一個小括號的行

[root@localhost /]# grep "^[[:alnum:]_].*()" /etc/rc.d/init.d/functions

 3、使用egrep取出/etc/rc.d/init.d/functions中其基名

    [root@localhost testdir]# echo "/etc/aa/bb/" | egrep   "[^/]+*/?$"

 4、使用egrep取出上面路徑的目錄名

   [root@localhost testdir]# echo "/etc/aa/bb" | egrep   "^[^[:alnum:]]+.*/"

 6、顯示ifconfig命令結果中所有IPv4地址

 ifconfig | egrep --color=auto "(\b([1-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b\.)(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b\.){2}(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b)"

 7、顯示/proc/meminfo文件中以大小s開頭的行; (要求:使用兩種方式)

[root@localhost testdir]# grep "^[S|s]" /proc/meminfo
[root@localhost testdir]# grep -i "^s" /proc/meminfo

 8、顯示/etc/passwd文件中不以/bin/bash結尾的行

[root@localhost testdir]# grep -v  "/bin/bash$" /etc/passwd

 9、顯示用戶rpc默認的shell程序

[root@localhost testdir]# grep "^\brpc\b" /etc/passwd | cut -d: -f3,7

 10、找出/etc/passwd中的兩位或三位數

[root@localhost testdir]# grep "\([[:digit:]]\)\{2,3\}" /etc/passwd

 11、顯示/etc/grub.cfg文件中,至少以一個空白字符開頭的且后面存非空白字符的行

[root@localhost testdir]# grep "^[[:space:]].*[^[:space:]]" /etc/grub.conf

 12、找出"netstat -tan"命令的結果中以'LISTEN'后跟0、 1或多個空白字符結尾的行

[root@localhost testdir]# netstat -tan | grep "\bLISTEN[[:space:]]*$"

13、找出/etc/passwd文件中用戶名同shell名的行

[root@localhost /]# egrep "^(\<.*\>)+.*\1$" /etc/passwd
[root@localhost testdir]# egrep "^([[:alpha:]]+):.*\1$" /etc/passwd

14、用正則表達式表示IP地址

[root@localhost testdir]#  ifconfig | egrep --color=auto -o "(\b([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|2[0-2][0-3]])\b\.)(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b\.){2}(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\b)"

15、用正則表達式表示手機號11 13 17 15  18 

 egrep "\b1[345678][0-9]{9}\b"

原創文章,作者:Lii,如若轉載,請注明出處:http://www.www58058.com/29892

(0)
LiiLii
上一篇 2016-08-08 16:16
下一篇 2016-08-08 16:16

相關推薦

  • 第五周作業

    1、顯示當前系統上root、fedora、或user1用戶的默認shell;          [root@yangjifeng~]# grep -E “^(root|fedora|user1)\>” /etc/passwd | cut -d: -f…

    Linux干貨 2017-09-04
  • 基礎命令

    1,對于Linux的實驗環境我們要用到虛擬機,往往每次上線都要登錄,這時候如果把用戶設為自動登錄就會方便許多,接下來就介紹下設置虛擬機的自動登錄 , /etc/gdm/custom.conf 這個就是設置自動登錄的一個配置文件,我們先來使用nano打開這個文件,如下 # GDM configuration storage 這是GDM的一個配置存儲 [daem…

    2017-11-19
  • linux發展史——獸人永不為奴

      了解歷史才能判斷趨勢。既然我們已經打算跳入運維這個坑,了解先烈的歷史事跡是必須的。為什么說是必須的呢?現在我們處于一個知識時代,資本在追著知識跑,像海銀資本這種vc都看不起中國的市場了,已經帶著中國的資本在萬惡資本主義的老美投資了。 1計算機硬件組成   操作系統成為了非常重要人類創造生產力的場所,很多人都開始追本…

    Linux干貨 2016-10-14
  • 設計模式(四)原型模式Prototype(創建型)

    1.   概述 我們都知道,創建型模式一般是用來創建一個新的對象,然后我們使用這個對象完成一些對象的操作,我們通過原型模式可以快速的創建一個對象而不需要提供專門的new()操作就可以快速完成對象的創建,這無疑是一種非常有效的方式,快速的創建一個新的對象。 例子1:孫悟空拔下一嘬猴毛,輕輕一吹就會變出好多的孫悟空來。 例子2:寄個快遞下面是一個郵寄快…

    Linux干貨 2015-06-25
  • LVM(邏輯卷管理)

    LVM 邏輯卷管理 概述:      LVM是將一個或多個硬盤的分區在邏輯上集合,相當于一個大硬盤來使用,當硬盤的空間不夠使用的時候,可以繼續將其它的硬盤的分區加入其中,這樣可以實現磁盤空間的動態管理,相對于普通的磁盤分區有很大的靈活性。與傳統的磁盤與分區相比,LVM為計算機提供了更高層次的磁盤存儲。它使系統管理員可以更方便的為…

    Linux干貨 2016-09-05
欧美性久久久久