在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中任意一個數字 # | :表示或