grep與正則表達式
grep
使用語法:grep [-abcEFGhHilLnqrsvVwxy][-C<顯示列數>][-e<范本樣式>][-f<范本文件>][范本樣式][文件或目錄...]
功能說明:查找指定文件或標準輸入里符合條件的字符串
常用選項
-a 或–text 不要忽略二進制的數據。
-A<顯示列數>或–after-context=<顯示列數> 除了顯示符合范本樣式的那一列之外,并顯示該列之后的內容。
-b 或–byte-offset 在顯示符合范本樣式的那一列之前,標示出該列第一個字符的位編號。
1.[root - gwx-st ~/test]#>grep -A1 -B1 -b "^bin" passwd
2.0-root:x:0:0:root:/root:/bin/bash
3.32:bin:x:1:1:bin:/bin:/sbin/nologin
4.65-daemon:x:2:2:daemon:/sbin:/sbin/nologin-B<顯示列數>或–before-context=<顯示列數> 除了顯示符合范本樣式的那一列之外,并顯示該列之前的內容。
1.[root - gwx-st ~/test]#>head -3 passwd
2.root:x:0:0:root:/root:/bin/bash
3.bin:x:1:1:bin:/bin:/sbin/nologin
4.daemon:x:2:2:daemon:/sbin:/sbin/nologin
5.[root - gwx-st ~/test]#>grep -A1 -B1 "^bin" passwd
6.root:x:0:0:root:/root:/bin/bash
7.bin:x:1:1:bin:/bin:/sbin/nologin
8.daemon:x:2:2:daemon:/sbin:/sbin/nologin-c 或–count 計算符合范本樣式的列數。
1.[root - gwx-st ~/test]#>grep -c "^bin" passwd
2.1
3.[root - gwx-st ~/test]#>grep "^bin" passwd
4.bin:x:1:1:bin:/bin:/sbin/nologin-C<顯示列數>或–context=<顯示列數>或-<顯示列數> 除了顯示符合范本樣式的那一列之外,并顯示該列之前后的內容。
1.[root - gwx-st ~/test]#>grep -C1 "^bin" passwd
2.root:x:0:0:root:/root:/bin/bash
3.bin:x:1:1:bin:/bin:/sbin/nologin
4.daemon:x:2:2:daemon:/sbin:/sbin/nologin-d<進行動作>或–directories=<進行動作> 當指定要查找的是目錄而非文件時,必須使用這項參數,否則 grep 指令將回報信息并停止動作。
-e<范本樣式>或–regexp=<范本樣式> 指定字符串做為查找文件內容的范本樣式。
-E 或–extended-regexp 將范本樣式為擴展正則表達式來使用。
1.[root - gwx-st ~/test]#>grep "^ro+t" passwd
2.[root - gwx-st ~/test]#>grep -E "^ro+t" passwd
3.root:x:0:0:root:/root:/bin/bash
4.[root - gwx-st ~/test]#>grep "^ro\+t" passwd
5.root:x:0:0:root:/root:/bin/bash-f<范本文件>或–file=<范本文件> 指定范本文件,其內容含有一個或多個范本樣式,讓grep 查找符合范本條件的文件內容,格式為每列一個范本樣式。
1.[root - gwx-st ~/test]#>cat username.list
2.root
3.gwx
4.test
5.[root - gwx-st ~/test]#>grep -f username.list passwd
6.root:x:0:0:root:/root:/bin/bash
7.operator:x:11:0:operator:/root:/sbin/nologin
8.gwx:x:1000:1000:gwx:/home/gwx:/bin/bash
9.test1:x:1012:1012::/home/test1:/bin/bash
10.test2:x:1013:1013::/home/test2:/bin/bash-F 或–fixed-regexp 將范本樣式視為固定字符串的列表。即不適用正則表達式。
1.[root - gwx-st ~/test]#>grep "^bin" passwd
2.bin:x:1:1:bin:/bin:/sbin/nologin
3.[root - gwx-st ~/test]#>grep -F "^bin" passwd
4.[root - gwx-st ~/test]#>-G 或–basic-regexp 將范本樣式視為正則表達式來使用。默認使用的基本正則表達式。
-h 或–no-filename 在顯示符合范本樣式的那一列之前,不標示該列所屬的文件名稱。默認選項。
-H 或–with-filename 在顯示符合范本樣式的那一列之前,標示該列所屬的文件名稱。
1.[root - gwx-st ~/test]#>grep -H "^gwx" passwd
2.passwd:gwx:x:1000:1000:gwx:/home/gwx:/bin/bash-i 或–ignore-case 忽略字符大小寫的差別。
1.[root - gwx-st ~/test]#>grep -i "^GWX" passwd
2.gwx:x:1000:1000:gwx:/home/gwx:/bin/bash-l 或–file-with-matches 列出文件內容符合指定的范本樣式的文件名稱。
1.[root - gwx-st /]#>grep -r -l "root.*" ~/test/
2./root/test/passwd
3./root/test/username.list-L 或–files-without-match 列出文件內容不符合指定的范本樣式的文件名稱。
1.[root - gwx-st /]#>grep -r -L "root.*" ~/test/
2./root/test/test1
3./root/test/test2-n 或–line-number 在顯示符合范本樣式的那一列之前,標示出該列的列數編號。
1.[root - gwx-st ~/test]#>grep -n "^gwx" passwd
2.22:gwx:x:1000:1000:gwx:/home/gwx:/bin/bash-q 或–quiet 或–silent 不顯示任何信息。
-r 或–recursive 此參數的效果和指定“-d recurse”參數相同。
1.[root - gwx-st /]#>grep -r "root.*" ~/test/
2./root/test/passwd:root:x:0:0:root:/root:/bin/bash
3./root/test/passwd:operator:x:11:0:operator:/root:/sbin/nologin
4./root/test/username.list:root-s 或–no-messages 不顯示錯誤信息。
1.[root - gwx-st /]#>grep -L "root.*" ~/test/
2.grep: /root/test/: Is a directory
3./root/test/
4.[root - gwx-st /]#>grep -L -s "root.*" ~/test/
5./root/test/-v 或–revert-match 反轉查找。
1.[root - gwx-st ~/test]#>cat test2
2.ad
3.ag
4.ga
5.[root - gwx-st ~/test]#>grep -v "^a" test2
6.ga-V 或–version 顯示版本信息。
-w 或–word-regexp 只顯示全字符合的列。
-x 或–line-regexp 只顯示全列符合的列。
-y 此參數的效果和指定“-i”參數相同。
-o 只顯示與范本樣式匹配的字符串
1.[root - gwx-st ~/test]#>grep -o "^a" test2
2.a
3.a
4.[root - gwx-st ~/test]#>grep "^a" test2
5.ad
6.ag
正則表達式
正則表達式(regular expression)描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。
列目錄時, dir *.txt或ls *.txt中的*.txt就不是一個正則表達式,因為這里*與正則式的*的含義是不同的。此處的*為通配符。
構造正則表達式的方法和創建數學表達式的方法一樣。也就是用多種元字符與運算符可以將小的表達式結合在一起來創建更大的表達式。正則表達式的組件可以是單個的字符、字符集合、字符范圍、字符間的選擇或者所有這些組件的任意組合。
正則表達式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為”元字符”)組成的文字模式。模式描述在搜索文本時要匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。
下面我們來看一下正則表達式所支持的常用元字符
字符 描述 \ 將下一個字符標記為一個特殊字符、或一個原義字符、或一個向后引用、或一個八進制轉義符。例如,’n’ 匹配字符 “n”?!痋n’ 匹配一個換行符。序列 ‘\\’ 匹配 “\” 而 “\(” 則匹配 “(“。 ^ 匹配輸入字符串的開始位置。 $ 匹配輸入字符串的結束位置。 * 匹配前面的子表達式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等價于{0,}。 + 匹配前面的子表達式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等價于 {1,}。 ? 匹配前面的子表達式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等價于 {0,1}。 {n} n 是一個非負整數。匹配確定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的兩個 o。 {n,} n 是一個非負整數。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o?!痮{1,}’ 等價于 ‘o+’。’o{0,}’ 則等價于 ‘o*’。 {n,m} m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 將匹配 “fooooood” 中的前三個 o?!痮{0,1}’ 等價于 ‘o?’。請注意在逗號和兩個數之間不能有空格。 ? 當該字符緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對于字符串 “oooo”,’o+?’ 將匹配單個 “o”,而 ‘o+’ 將匹配所有 ‘o’。 . 匹配除 “\n” 之外的任何單個字符。要匹配包括 ‘\n’ 在內的任何字符,請使用象 ‘[.\n]’ 的模式。 (pattern) 匹配 pattern 并獲取這一匹配。所獲取的匹配可以從產生的 Matches 集合得到,如需引用則使用 \1…。要匹配圓括號字符,請使用 ‘\(’ 或 ‘\)’。 (?:pattern) 匹配 pattern 但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以后使用。這在使用 “或” 字符(|)來組合一個模式的各個部分是很有用。例如, ‘industr(?:y|ies) 就是一個比 ‘industry|industries’ 更簡略的表達式。 (?=pattern) 正向預查,在任何匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。 (?!pattern) 負向預查,在任何不匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。 x|y 匹配 x 或 y。例如,’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 則匹配 “zood” 或 “food”。 [xyz] 字符集合。匹配所包含的任意一個字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。 [^xyz] 負值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’、’l’、’i’、’n’。 [a-z] 字符范圍。匹配指定范圍內的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范圍內的任意小寫字母字符。 [^a-z] 負值字符范圍。匹配任何不在指定范圍內的任意字符。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范圍內的任意字符。 \b 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 \< 匹配一個單詞的詞首 > 匹配一個單詞的詞尾 \B 匹配非單詞邊界。’er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 好了,接下來讓我們實踐一下吧~~
顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間至少出現一位數字(可以有其它字符)的文件或目錄。
1.[root - gwx-st ~/test]#>ls /var |grep -E "^l.*[[:digit:]]+.*[[:lower:]]$"
2.l1b
3.ll2a2iii3d顯示/etc目錄下,以任意一個數字開頭,且以非數字結尾的文件或目錄。
1.[root - gwx-st ~/test]#>ls /etc/ |grep "^[0-9].*[^0-9]$"
2.1agasga21dad顯示/etc目錄下,以非字母開頭,后面跟了一個字母以及其它任意長度任意字符的文件或目錄。
1.[root - gwx-st ~/test]#>ls /etc/ |grep -E "^[^[:alpha:]][[:alpha:]]+.*"
2.1agasga21dad復制/etc目錄下所有以p開頭,以非數字結尾的文件或目錄到/tmp/mytest1目錄中。
1.[root - gwx-st ~/test]#>cp -rf /etc/p*[^0-9] /tmp/mytest1
復制/etc目錄下所有以.d結尾的文件或目錄至/tmp/mytest2目錄中。
1.[root - gwx-st ~/test]#>cp -rf /etc/*.d /tmp/mytest2
復制/etc/目錄下所有以l或m或n開頭,以.conf結尾的文件至/tmp/mytest3目錄中。
1.[root - gwx-st ~/test]#>cp -rf /etc/[lmn]*.conf /tmp/mytest3
原創文章,作者:N24-wenxuan,如若轉載,請注明出處:http://www.www58058.com/57632
贊,grep 總結的比較詳細~~排版也比較好~繼續加油~