天天看點

grep、egrep、fgrep的用法與特性詳解

開篇

       學習Linux也有一段時間了,對Linux多少也算是有點了解了,越是了解也就越對這個系統有興趣,從0基礎開始,已經學習了兩周了吧,說實在的,很多的東西都是邏輯的問題,而學習Linux就是要熟悉指令,指令很多,要記的東西也很多,多得可以你讓頭皮發麻,不過話又說回來了,既然選擇了這門技術,那就義無反顧的去做好做專,好了,總結一下這兩周來感覺學起來比較用力的部分。

正文之:grep的詳細介紹

       grep和egrep是現在感覺比較難的一部分,主要是符号多,看得眼花了亂。

       grep(global search regular expression and prind out the line)全稱就叫全面搜尋正規表達式 并列印行出來,簡單來說就是文本搜尋工具,根據使用者指定的文本搜尋模式對目标文本進行搜尋,顯示能夠所比對的行,當然,也可以把grep看也是一個文本過慮器。

       格式:grep [options]... 'PATTERD模式' file....

       模式:就是一個最基本的字元串    

       如:grep –A 1 '[r][[:punct:]]*[t]' /etc/passwd  ''裡的内容就是模式

grep的常用選項:

       -v:反向比對、顯示不能别模式比對到的行;

       例:取出/etc/fstab不包含#号的行

       gerp –v "#" /etc/fstab

[root@localhost xiao]         # cat /etc/fstab        
         #        
         # /etc/fstab        
         # Created by anaconda on Mon Feb 10 10:38:04 2014        
         #        
         # Accessible filesystems, by reference, are maintained under '/dev/disk'        
         # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info        
         #        
         /dev/mapper/vg0-root            /                       ext4    defaults        1 1        
         UUID=99e81364-46cb-4795-974a-6cc0ab91a46f         /boot                            ext4    defaults        1 2                 /dev/mapper/vg0-usr             /usr                             ext4    defaults        1 2        
         /dev/mapper/vg0-var             /var                             ext4    defaults        1 2        
         /dev/mapper/vg0-swap            swap                    swap    defaults        0 0        
         tmpfs                           /dev/shm                         tmpfs   defaults        0 0        
         devpts                          /dev/pts                         devpts  gid=5,mode=620  0 0        
         sysfs                           /sys                             sysfs   defaults        0 0        
         proc                            /proc                            proc    defaults        0 0        
         [root@localhost xiao]         # grep -v "#" /etc/fstab        
         /dev/mapper/vg0-root            /                       ext4    defaults        1 1        
         UUID=99e81364-46cb-4795-974a-6cc0ab91a46f         /boot                            ext4    defaults        1 2        
         /dev/mapper/vg0-usr             /usr                             ext4    defaults        1 2        
         /dev/mapper/vg0-var             /var                             ext4    defaults        1 2        
         /dev/mapper/vg0-swap            swap                    swap    defaults        0 0        
         tmpfs                           /dev/shm                         tmpfs   defaults        0 0        
         devpts                          /dev/pts                         devpts  gid=5,mode=620  0 0        
         sysfs                           /sys                             sysfs   defaults        0 0        
         proc                            /proc                            proc    defaults        0 0      

       -o:僅比對被模式比對到的字串,而非整行,就是僅顯示比對到的内容

       例:隻顯示/etc/fstab為mapper的字串

       grep -o "mapper" /etc/fstab

[root@localhost xiao]         # grep --color=auto -o "mapper" /etc/fstab        
         mapper        
         mapper        
         mapper        
         mapper      

       -i:不區分大小寫對文本進行比對搜尋

grep、egrep、fgrep的用法與特性詳解

       -E:支援擴充正規表達式

       -A #:顯示模式比對到的行以及後面的N行 #代表你要顯示多少行

       例:顯示/etc/passwd中shutdown使用者後面3行

grep、egrep、fgrep的用法與特性詳解

       -B #:顯示模式比對到的行以及前面的N行

       例:顯示/etc/passwd中shutdown使用者上面2行

grep、egrep、fgrep的用法與特性詳解

       -C #:顯示模式比對到的行以及上下的N行

       例:顯示/etc/passwd中shutdown使用者上下面2行

grep、egrep、fgrep的用法與特性詳解

   其實,要用好grep的強大搜尋功能,那就不得不說說正規表達式了:

   正規表達式就是一類字元所書寫出來的模式(pattern)、正規表達式基本上都是由元字元組成;

   那什麼是元字元呢:元字元不表示字元本身的意義,而是用于額外功能性的描述。

   基本正規表達式的元字元:學習正規表達式主要是來學習其元字元的用法後慢慢組合這些元字元來表達到正規表達式的使用,grep在預設情況下隻支援基本正規表達式。

注意:

   模式當中一但包含元字元一定要用''或""号引起來,單雙引号都可以、隻不過如果其中出現了變量、并且我們希望做變量替換的話那就要使用""雙引号了、否則可以不加區分的使用。

   那就來說說元字元的通配:

       .(點号):比對任意的單個字元的

       例:grep "r..t" /etc/passwd

       rt加上兩點被比對到的隻有4個字元,點号表示的是單個字元

grep、egrep、fgrep的用法與特性詳解

      []:指定範圍内的任意的單個字元

           [0-9] [[:digit:]]:表示比對0到9的任意單個數字、兩種表示方法都可以

           [a-z] [[:lower:]]:表示比對小寫的a到z的任意單個字母、即a-z

           [A-Z] [[:upper:]]:表示比對大寫的A到Z的任意單個字母、即A-Z

           [[:alpha:]]:表示英文大小寫字母、即:a-z,A-Z

           [[:space:]]:表示包含的空白字元、即空格鍵,tab鍵

           [[:alnum:]]:表示包含數字大小寫字母、即0-9,A-Z,a-z

           [[:punct:]]:表示包含标點符号、即:" ' ? ! ; : # $...

       例:顯示/etc/fstab下含有數字的行

       grep --color [0-9] /etc/fstab

grep、egrep、fgrep的用法與特性詳解

       例:顯示/etc/fstab中包含大寫字母的行

       grep --color "[[:upper:]]" /etc/fstab        

grep、egrep、fgrep的用法與特性詳解

    [^]:表示指定範圍外的任意單個字元、就是使用了脫字元取反

        例:顯示/etc/fstab中數字以外的内容

        grep --color [^[:digit:]] /etc/fstab

grep、egrep、fgrep的用法與特性詳解

   字元的次數比對:用來比對其前面的字元的次數的

           *:(星号)比對其緊挨着星号的字元出現任意次

               例:x*y就是x可以出現意次、包括0次

           .*:(點星)比對任意長度的任意字元

           \?:表示其前面的字元出現0次或者1次、\是轉譯字元

               例:x\?y:可以比對到的隻有xy和y

           \{m\}:比對m次  如:x\{4\}y表示y前面的x出現4前就可以被比對到

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

           \{m,\}:至少m次

           \{0,n\}:至多比對n次、0不可以省略

            例:找出/etc/fstab檔案中一位數或兩位數

           grep --color '\<[0-9]\{1,2\}\>' /etc/fstab

           \{1,2\}:表示0-9的數字出現的至有1位、至多有2位、

grep、egrep、fgrep的用法與特性詳解

   位置錨定符:用于指定字元出現的位置

           ^:用于錨定行首,如(^Char) 比對到的字元必須出現有行首的

           $:用于錨定行尾,如(Char$) grep 'bash$' /etc/passwd

           ^$:空白行、查找一個檔案中所出現的空白行  ^hello$表示隻有hello的行

           例:顯示/etc/fstab中以#号開頭的行

           grep --color "^#" /etc/fstab

grep、egrep、fgrep的用法與特性詳解

   單詞的錨定:

           \<char:錨定詞首,\<[r]表示一行以r開頭的單詞都可以比對、也可以使用\b表示

           char\>:錨定詞尾,一行以r開頭的單詞都可以比對、\b

           \<hello\>:表示精确錨定hello這個單詞

           \<h…o\>:表示以h開頭、以o結尾、中間跟了任意三個字元的單詞

           例:顯示/etc/passwd中以stu開頭的單詞

           grep --color "\<stu" /etc/passwd     隻要是以stu開頭的單詞都會被比對到

grep、egrep、fgrep的用法與特性詳解

   分組元字元:

           \(\):分組  \是轉譯字元  

           例:\(ab\)*xy

           ab括起來表示一個組了,表示xy前面的ab組現出任意次,可以被比對到的

           abxy,ababxy,ababababxy,abababababababxy,......

   引用: 對分組的字元塊進行引用

           \1:後向引用,引用前面的第一個左括号以及與之對應的右括号中模式所比對到的内容

           \2:後向引用,引用前面的第二個左括号以及與之對應的右括号中模式所比對到的内容

           .......

           例:\(a.b\)xy\1 可以比對到的有(abxyab不可以比對到)

           akbxyakb,a3bxya3b,aYbxyaYb

           例:我們來看這個例子、找出以下love與之對應的lover、like與之對應的liker

           He like his lover.

           She love her liker.

           He love his lover.

           She like her liker.

grep、egrep、fgrep的用法與特性詳解

正文之:egrep的詳細介紹

       egrep:使用擴充正規表達式來構模組化式,相當于grep –E、通常寫成egrep、用法基本上跟grep的相同、隻是有些不需要\轉譯

   元字元:字元比對

          .:比對任意單個字元

          []:指定範圍内的任意單個字元

   次數比對:

          *:比對其緊挨着星号的字元出現任意次

          ?:表示其前面的字元出現0次或者1次

          +:比對其前面的字元至少1次

          {m}:比對其前面的字元m次

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

          {m,}:至少m次

          {0,n}:至多n次

        例:找出/etc/fstab檔案中一位數或兩位數

       egrep --color '\<[0-9]{1,2}\>' /etc/fstab  {}不需要轉譯

grep、egrep、fgrep的用法與特性詳解

   做位置錨定:

        ^:行首錨定

        $:行尾錨定

        \<:詞首

        \>:詞尾

   分組:

       ():分組

       |:或者  ab|xy意思為ab或者xy  a(b|x)y意思為aby或者axy

正文之:fgrep的詳細介紹

   fgrep:fash,它不解析正規表達式、想找什麼就跟什麼就可以了;

       例:

       fgrep "/bin/bash" /etc/passwd

       例:顯示/etc/fstab中含有defaults的行

       fgrep --color "defaults" /etc/fstab

繼續閱讀