grep、egrep、fgrep命令和正則表達式用法

一、簡介

 1.1、grep說明

   grep命令簡單來說就是linux系統實現文本內容篩選過濾的命令。當我們需要快速定位查找文本(通常是配置文件)中我們需要的內容時,使用grep命令絕對算是最有效的處理方式之一。原因就在于grep可以配合包括“管道”、“正則表達式”等命令完成我們想要的關鍵字篩選過濾功能。個人認為不管是喜歡Linux系統的發燒友,還是DBA、程序員、運維人員、架構師、項目經理等,熟練運用掌握grep命令都是必不可少的。比如在日常工作中令開發人員很頭大的事情就是在查看tomcat中項目運行生成的日志文件,這些日志文件通常內容都非常之多,而快速定位到日志里面的異常錯誤提示信息是必不可少的,這種情況下其中一種解決方案就是采用grep命令來定位查找輸出關鍵信息(當然還有更多其他不錯的解決方案)。

 1.2、正則表達式說明

   正則表達式(英文:Regular Expression)簡單來說就是一種按特定要求定義的符合某種語法規則語義的字符串。采用正則表達式可以幫助我們實現過濾、篩選等常見功能。例如它可以輕松完成校驗電話、郵箱格式是否正確、url攔截匹配等常用功能,減少了一系列不必要的條件判斷,從而提升工作效率。從實用性角度來說,不管是在linux系統中配合grep命令實現關鍵字查找匹配,還是數據庫編寫sql語句,甚至服務端及前端校驗數據安全性等方面都離不開正則表達式,它幾乎可以說是IT從業人士必須要理解掌握的關鍵技術。

二、用法

   首先grep是bash中非常好用的命令,雖然不是系統內置命令,不過一般的linux系統安裝完成之后都會自帶這個命令。grep命令常見用法有三種,分別是grep、egrepfgrep。下面分別介紹如下三種。

  2.1、grep 使用格式如下(關鍵參數標紅):

  grep [OPTIONS] PATTERN [FILE…]

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

  例1:實現在passwd文件中搜索root用戶并把搜索結構顯示出來的關鍵字標紅,命令如下:

  grep –color=auto "root" /etc/passwd

  效果如下圖:

  a.png

  例2:只顯示匹配到的關鍵字,不顯示其他內容,命令如下:

  grep –color=auto -o "root" /etc/passwd

  效果如下圖:

  a.png

  例3:如果想一直顯示關鍵字標紅功能,可以定義別名,保證長期有效,如當前root用戶永久生效此配置,

  設置方式如下圖:

  a.png

  例4:搜索結果出現的關鍵字忽略字母大小寫,命令如下:

  grep -i "root" /etc/passwd

  效果如下圖:

  a.png

  例5:實現搜索結果取反操作(顯示為非匹配的搜索結果),命令如下:

  grep -v "abc" test.txt

  效果如下圖:

  a.png

 例6:搜索結果顯示行號,命令如下:

 grep -n "ab" text.txt

 效果如下圖:

 a.png

 例7:查找出匹配的搜索結果前n行、后n行或前后n行,命令如下:

 grep -A 2 "AbC" text.txt

 grep -B 2 "AbC" text.txt

 grep -C 2 "AbC" text.txt

grep、egrep、fgrep命令和正則表達式用法 效果如下圖:

 a.png

 例8:grep命令不僅可以查找文本匹配內容,文件夾和文件也能通過grep配合管道實現查找,命令如下:

   a.png

 2.2、grep配合正則表達式

 2.2.1、字符匹配

 例1:(正則表達式.) 搜索匹配任意單個字符,命令如下:

 grep "a.c" test.txt

 效果如下圖:

 a.png

 例2:(正則表達式[])搜索指定范圍匹配的任意單個字符,命令如下:

 grep "[ad]" test.txt

 效果如下圖:

 a.png

 

 例3:(正則表達式[^])搜索指定范圍匹配的任意單個字符,命令如下:

 grep "[^ad]" test.txt

 效果如下圖:

 a.png

 

 例4:(正則表達式[0-9]或[[:digit:]])搜索指定數字范圍內匹配到的結果,命令如下:

 grep "[0-9]" test.txt 或 grep "[[:digit:]]" test.txt

 效果如下圖:

 a.png

 例5:(正則表達式[a-z]或[[:lower:]])搜索指定小寫字母范圍內匹配到的結果,命令如下:

 grep "[a-z]" test.txt 或 grep "[[:lower:]]" test.txt

 效果如下圖:

 a.png

 例6:(正則表達式[A-Z]或[[:upper:]])搜索指定寫字母范圍內匹配到的結果,命令如下:

 grep "[A-Z]" test.txt 或 grep "[[:upper:]]" test.txt

 效果如下圖:

grep、egrep、fgrep命令和正則表達式用法 a.png

 例7:(正則表達式[[:space:]])搜索匹配單行包含空格的內容,命令如下:

 grep "[[:space:]]" test.txt

 效果如下圖:

 a.png

 例8:(正則表達式[[:punct:]])搜索匹配單行包含標點符號的內容,命令如下:

 grep "[[:punct:]]" test.txt

 效果如下圖:

 a.png

 例9:(正則表達式[[0-9a-z-A-Z]]或[[:alnum:]])搜索匹配單行包含數字和大小寫字母的內容,命令如下:

 grep "[[0-9a-zA-Z]]" test.txt  或 grep "[[:alnum:]]" test.txt 

 效果如下圖:

 a.png

 a.png

 例10:(正則表達式[[a-z-A-Z]]或[[:alpha:]])搜索匹配單行包含大小寫字母的內容,命令如下:

 grep "[[a-zA-Z]]" test.txt 或 grep "[[:alpha:]]" test.txt

 效果如下圖:

 a.png

 2.2.2、次數匹配

 例1:(正則表達式*)搜索匹配單行*左側的任意長度的字符,包含0次1次或多次,命令如下:

 grep "a*" test.txt

 效果如下圖:

 a.png

 例2:(正則表達式.*)搜索匹配單行任意長度的任意字符,包含0次1次或多次,屬于貪婪模式,命令如下:

 grep "a.*" test.txt

 效果如下圖:

 a.png

 例3:(正則表達式\?)搜索匹配單行\?左側字符出現0次或1次,命令如下:

 grep "d\?" test.txt

 效果如下圖:

 a.png

 例4:(正則表達式\+)搜索匹配單行\+左側字符至少出現1次,命令如下:

 grep "a\+" test.txt

 效果如下圖:

 a.png

 例5:(正則表達式\{m\})搜索匹配單行\{m\}左側字符精確出現m次,命令如下:

 grep "a\{2\}" test.txt

 效果如下圖:

 a.png

 例6:(正則表達式\{m,n\})搜索匹配單行\{m,n\}左側字符至少出現m次,至多出現n次,命令如下:

 grep "a\{1,2\}" test.txt

 效果如下圖:

 a.png

 例7:(正則表達式\{0,n\})搜索匹配單行\{0,n\}左側字符最多出現n次,命令如下:

 grep "a\{0,2\}" test.txt

 效果如下圖:

 a.png

 例8:(正則表達式\{m,\})搜索匹配單行\{m,\}左側字符至少出現m次,命令如下:

 grep "a\{m,\}" test.txt

 效果如下圖:

 a.png

 2.2.3、位置錨定

 例1:(正則表達式^)搜索匹配單行錨定行首內容,命令如下:

 grep "^a" test.txt

 效果如下圖:

 a.png

 例2:(正則表達式$)搜索匹配單行錨定行尾內容,命令如下:

 grep "c$" test.txt

 效果如下圖:

 a.png

 例3:(正則表達式^$)搜索匹配空白行內容,命令如下:

 grep "^$" test.txt

 效果如下圖:

 a.png

 例4:單詞錨定:

 (正則表達式\<)實現錨定詞首,也可以用\b實現同樣效果

 (正則表達式\>)實現錨定詞尾,也可以用\b實現同樣效果

 命令如下:

 grep "\<12" test.txt 或 grep "\b12" test.txt

 grep "test\>" test.txt 或 grep "test\b" test.txt

 效果如下圖:

 a.png

 整個單詞錨定:

 (正則表達式\<…\>)實現錨定整個詞,也可以用\b實現同樣效果

 命令如下:

 grep "\<456test\>" test.txt 或 grep "\b456test\b" test.txt

 效果如下圖:

 a.png

 例5:分組錨定:

 (正則表達式\(\))實現分組錨定,分組匹配到的結果字符,自動被grep記憶在內置變量中,這些變量分別是\1、\2 …并且這些變量可以再次被使用。

 \1: 引用,在該模式中自左而右,獲取由第一個左括號以及與之對應的右括號中的模式所匹配到的內容。

 \2: 引用,在該模式中自左而右,獲取由第二個左括號以及與之對應的右括號中的模式所匹配到的內容。

 命令如下:

 grep "\(123\)" test.txt

 grep "\(123\).*\1" test.txt

 grep "\(456\)….\1\(789\)\2" test.txt

 效果如下圖:

 a.png

  2.2.4、egrep 使用說明

  egrep使用格式與grep基本相同(可使用grep -E command實現同樣效果),不過egrep只支持擴展的正則表達式,不支持基本正則表達式。

     命令:egrep PATTERN FILE… 或 grep -E PATTERN FILE…

     egrep支持如下用法:

     字符匹配模式如下:

        .

        []

        [^]

     次數匹配模式如下:

        *: 任意次

        ?:0或1次

        +: 至少1次

       {m}:精確匹配m次;

       {m,n}:至少m次,至多n次;

       {m,}:至少m次;

       {0,n}:至多次;

     位置錨定模式如下:

        ^

        $

        \<, \b

        \>, \b

     分組匹配模式如下:

       ()

       引用:\1, \2, …

     或者匹配支持如下:

       a|b:a或b  或兩側的所有內容;

 

 egrep或者匹配示例:

 (正則表達式|)實現或者匹配,命令如下:

 egrep "456|789" test.txt 或 grep -E "456|789" test.txt

 效果如下圖:

 a.png

 2.2.5、fgrep 使用說明

 fgrep不支持正則表達式,只能實現全部關鍵字匹配,個人感覺實際工作中不太常用。

 fgrep示例:

 fgrep "abdc" test.txt

 效果如下圖:

 a.png

三.結尾總結

   grep以及相關正則表達式是linux系統中日常工作開發必須掌握的命令。egrep實現功能基本與grep相同,只是寫法稍有不同,可根據個人習慣選擇采用grep或egrep命令。fgrep因為不支持正則表達式,因此很少使用。



原創文章,作者:鏡花水月,如若轉載,請注明出處:http://www.www58058.com/7040

(1)
鏡花水月鏡花水月
上一篇 2015-08-31
下一篇 2015-08-31

相關推薦

  • 軟件包管理(RPM和yum)

        軟件包在系統管理中,軟件包的管理是最重要的,是系統管理的基礎的基礎;只有我們學會軟件包的管理才能談得上其它的應用;本文以目錄式的文檔格式,列出新手弟兄所面對的軟件包的安裝、更新、查詢相對的文檔,以及幾個常用的軟件包管理工具。 軟件包管理:     一,RPM包管理; &n…

    Linux干貨 2016-09-06
  • Linux Basics-Linux Bash歷史和其概念名詞解釋part1

    Linux Basics-Linux Bash歷史和其概念名詞解釋part1 閱讀本文你將知道:查看更多BashFAQ.pdf   Bash的歷史及其特性   Bash的如何工作   Bash的概念解釋   前提知識:      對linux有一定基礎而且了解Bash的…

    Linux干貨 2016-10-29
  • N25_第四周

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 cp -R /etc/skel /home/tuser1chmod 700 -R /home/tuser1 2、編輯/etc/group文件,添加組hadoop。 vim /etc/group hadoop:x:1010:1…

    Linux干貨 2016-12-25
  • 軟連接與硬連接

    硬鏈接定義 新建的文件是已經存在的文件的一個別名,當原文件刪除時,新建的文件仍然可以使用. 硬鏈接(hard link) ln   UNIX文件系統提供了一種將不同文件鏈接至同一個文件的機制,稱這種機制為鏈接。它可以使得單個程序對同一文件使用不同的名字。這樣的好處是文件系統只存在一個文件的副本。系統簡單地通過在目錄中建立一個新的登記項來實現這種連接。該登記項…

    Linux干貨 2017-07-22
  • 【N25第一周作業】Linux上命令的使用格式和基礎命令詳解

    一、Linux上命令的使用格式 命令行提示符詳解: 用戶通過終端的命令行接口來控制操作系統,登陸后如下: [root@localhost ~]# root: 當前登錄的用戶 @:分隔符 localhost: 當前主機的主機名,非完整格式;此處的完整格式為:localhost.localdomain [root@localhost ~]#&…

    Linux干貨 2016-12-03
  • Linux的哲學思想第二篇

    Linux的哲學思想 一切皆文件 物理終端 物理終端指的是顯示器等硬件終端設備,文件存在于 /dev/console 這個路徑下 虛擬終端 虛擬終端指的是在linux命令行連接的終端,文件存在于 /dev/tty# [1,6] 這個路徑下 串行終端 指的是使用計算機串行端口連接的終端設備,文件存在于 /dev/ttyS# 這個路徑下 偽終端 指的是在Xshe…

    2018-02-26
欧美性久久久久