grep+正則表達式


在Linux運維中會常用到三劍客中的grep命令,grep命令對文本文件搜索,搜索是以行爲單位進行的,用於搜索指定匹配模式中的行。grep命令在不使用正則表式能夠完成簡單的一些工做,當你面對幾萬行或更多的文件時,你是否是已經醉了@_@。。。那就請使用正則表達式吧,它是你強大而有力的助手。git

        

  他們都說正則表達式很難,你是否是已經懼怕了呢?若是你想在幾分鐘以內就能徹底的精通正則表達式,要麼你是一個天才,要麼你是從外星球來的。正則表達式

        

  學習正則表式是要通過長期的不斷的練習,我相信你就是下一個天才。。bash

        

  正則表達式分爲基本正則表達式與擴展正則表達式。    運維

        

  我但願我能以最簡單的例子讓你明白grep和正則表達式中一些簡單的用法:ide


(1)查找/etc/passwd文件中有「root」字樣的行:oop

[root@Bisc-lab01 ~]# grep -n--color "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
#-n:表示顯示查找到的行號
#--color:用顏色來高亮顯示所匹配的內容
#」root」:查找行有」root」字樣的行,這就是咱們要查找的條件
#/etc/passwd:指定查找的文件,能夠是絕對路徑或相對路徑

(2)  查找/etc/passwd文件,只顯示數字爲兩位數的數字學習

[root@Bisc-lab01 ~]# grep -o"\b[0-9]\{2\}\b" /etc/passwd
12
10
14
……………省略輸出……………
#-o:只顯示被模式匹配到內容
#\b:用於錨定模式的詞首,不是行首哦!!!使用「\<」等於「\b」。
#[0-9]:表示全部的數字,也能夠用[:digit:]表示0-9。[]在表示區間範圍,在正則表達式中表示
#      匹配區間範圍內單個任意字符。若是我想取除了數字以外的任意字符呢?使用「[^]」。
#\{2\}:表示精確的匹配其前一個字符出現2次。
#\b:錨定詞尾,等價於「\>」

(3)查找/etc/passwd文件中,以r開頭其後跟着任意的字符,但以sh結尾的行。spa

[root@Bisc-lab01 ~]# grep"^r.*sh$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
#^:表示行首,「^r」表示以r爲行首的行
#.*:表示任意字符任意次,「.」(點):表示任意單個字符;「*」:表示其前個字符出現任意次,
#    能夠是0次,1次或更多;「.*」:組合起來就來就表示任意字符出現任意次。
#$:表示行尾,「sh$」:表示以sh結尾的行。

(4)查找/etc/passwd文件中,以其字母開爲行首,必以其字母結尾的行。hadoop

思路
分析此題:表示以什麼字母爲行首,就以什麼字母結束,如a………a,中間是任意的字符,
[root@Bisc-lab01 ~]# grep"^\([a-zA-Z]\).*\1$" /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nfsnobody:x:65534:65534:AnonymousNFS User:/var/lib/nfs:/sbin/nologin
hadoop:x:600:600::/home/hadoop:/bin/bash
#[a-zA-Z]:表示全部字母,其a-zA-Z等價於[:alpha:],若是[[:alpha:]]*是什麼意思呢?將會出現
#          匹配到全部的/etc/passwd的行。
#\(\):表示分組,意思就是用於記憶grep匹配過程當中[a-zA-Z]的值。
\1:引用,從左至右的每個括號中的匹配過程當中的值。

(5)查找ifconfig命令結果輸出的全部1-255的數字it

思路:
         分析此題:1-255數字的構成,咱們能夠這樣的來分析:
         1-9:[1-9]
         10-99:[1-9][0-9]
         100-199:1[0-9][0-9]
         200-249:2[0-4][0-9]
         250-255:25[0-5]
         在查找中可能會有1位的數,2位的數或3位的數,因此咱們要使用擴展正則表達式中的或「|」
[root@Bisc-lab01 ~]# ifconfig|grep -E "\b([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b"
eth0      Link encap:Ethernet  HWaddr 00:0C:29:32:A8:C8 
          inet addr:172.16.9.20  Bcast:172.16.255.255  Mask:255.255.0.0
          inet6 addr:fe80::20c:29ff:fe32:a8c8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500 Metric:1
          RX bytes:7258553 (6.9 MiB)  TX bytes:764629 (746.7 KiB)
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536 Metric:1
          RX packets:24 errors:0 dropped:0overruns:0 frame:0
          TX packets:24 errors:0 dropped:0overruns:0 carrier:0
          RX bytes:1940 (1.8 KiB)  TX bytes:1940 (1.8 KiB)
#\b:表示錨定詞首
#():表示分組,在此題中用於表示標識一個詞,也就是1-255其中的一個數,擴展正則表達式的()括號不用\轉義。
#[1-9]:表示1到9中任意一個數字
# | :表示或
相關文章
相關標籤/搜索