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
下一篇 2016-08-08

相關推薦

  • 初步了解計算機組成及Linux系統

    一、計算機的組成及其功能: 計算機主要由三部分組成: 輸入單元:包括鍵盤、鼠標、卡片閱讀器、掃描儀、手寫板等。 輸出單元使我們能夠將一些數據輸入到主機里,然后再由主機的功能處理成為圖表或文章等信息后,將結果傳輸到輸出設備,如屏幕或打印機上面。 中央處理器(CPU):其中包含算數邏輯、控制、記憶等單元。 CPU作為一個具有特定功能的芯片,里面含有微指令集,如果…

    Linux干貨 2017-09-24
  • 文件通配符練習

    課后資料補充 * : 通配符,代表任意字符(0到多個)? : 通配符,代表一個字符# : 注釋/ : 跳轉符號,將特殊字符或通配符還原成一般符號| : 分隔兩個管線命令的界定; : 連續性命令的界定~ : 用戶的根目錄$ : 變量前需要加的變量值! : 邏輯運算中的&q…

    Linux干貨 2016-08-08
  • Linux之查找命令find簡介

    查找命令find簡介    Linux使用過程中難免會遇到查找功能,類似于Windows中的搜索功能,如果想要找某個文件在什么地方,什么格式的文件等等。在Linux中我們可以使用find、locate、which、whereis等命令。接下來我們就簡單說一下如何使用這幾個命令查找文件。 一、which which命令的作用是,在PATH變…

    Linux干貨 2015-05-18
  • N27網絡班第6周作業

    1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; :%s@^[[:space:]]\+@#&@g 2、復制/boot/grub/grub.conf 至/tmp目錄中,刪除/tmp/grub.conf文件中的行首的空白字符 :%s@^[[:space:]]…

    Linux干貨 2017-09-03
  • OPenSSL

    OPenSSL   OpenSSL 是一個安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議,并提供豐富的應用程序供測試或其它目的使用.   SSL是Secure Sockets Layer(安全套接層協議)的縮寫,可以在Internet上提供秘密性傳輸。Netscape公司在推出第一個Web瀏覽器的同時,提出了SSL協議標準?!?/p>

    Linux干貨 2016-11-07
  • N26-第五周作業-邢巖

    馬哥門徒-N26-邢巖    我要繼續今天的博客,《一萬小時天才理論》里提到了髓鞘質,我是不是正在慢慢的給自己包裹一層髓鞘質呢?如果還沒有,那么繼續吧。    第一題:顯示當前系統上root、fedora或user1用戶的默認shell。      ~]# grep -E &#8…

    2017-02-24
欧美性久久久久