1. 程式人生 > >grep-查詢符合條件的字串

grep-查詢符合條件的字串

grep:
        查詢行裡符合條件的字串


grep退出狀態:
    0: 表示成功;
    1: 表示在所提供的檔案無法找到匹配的pattern;
    2: 表示引數中提供的檔案不存在。


引數說明:
        -n: 在輸出符合條件的行時把行號顯示出來
        -v: 輸出不符合條件的行的字串
        -i: 輸出符合條件的行, 不區分大小寫
        -A: 後面可加數字, 表示輸出符合條件行外, 後續的n行也列出
        -B: 後面可加數字, 表示輸出符合條件行外, 前面的n行也列出
        --color=auto: 給符合條件的字串上色
        -c: 輸出匹配的行數
        -C number: 匹配的上下文分別顯示number行


        -s:不顯示不存在或無匹配文字的錯誤資訊。
        -h:查詢多檔案時不顯示檔名。
        -l:查詢多檔案時只輸出包含匹配字元的檔名。
        -L:  列出不匹配的檔名
        -w:  匹配的條件是整個單詞, 不是其中的一部分
        -r:  遞迴進行搜尋
        -a或--text: grep原本是搜尋文字檔案,若拿二進位制的檔案作為搜尋的 \
                    目標,則會顯示如下的訊息: Binary file 二進位制檔名 \
                    matches 然後結束。若加上-a引數則可將二進位制檔案視為 \
                    文字檔案搜尋,相當於--binary-files=text這個引數。
        -b: 列出模式之前的內文總共有多少byte
        -x: 搜尋符合模式的一行的字串, 要完全符合一行才會被列出


示例:
1. 搜尋特定串: 
grep -n 'how' permission.txt
        在permission.txt中查詢含有the的字串的行, 並顯示行號


2. 反向選擇:
grep -vn 'how' permission.txt
        在permission中查詢沒有含有the的字串的行, 並顯示行號


3. 不分大小寫
grep -in 'how' permission.txt
        在permission中查詢含有the(不分大小寫)的行, 並顯示行號


4. 用中括號[]來搜尋集合位元組
grep -n 'ss' permission.txt
    搜尋含有oo字串的行, 並顯示行號
grep -n '[^g]oo permission.txt
    搜尋第一個字母非g, 後接兩個o的字元中的行, 並顯示行號.
grep -n '[^a-z]oo' permission.txt
    搜尋不是小寫字母開頭, 後接兩個o的字串的行, 並顯示行號


5. grep pattern1 file | grep pattern2
        輸出同時匹配pattern1和pattern2的行


6. grep '\<man'*    只匹配man開頭的串
   grep '\<man\>'   只匹配'man'字串


7. grep -a ra /bin/echo
    不加-a引數的話, 會輸出提示"Binary file echo matches"後退出


8. grep -E 'li|na' if.sh
    啟用egrep, 把含有"li"或者"na"的行打印出來


9. grep -iE '(we)t.*\1' if.sh
    把在wet和we之間有零個或若個字元間隔的的字串的行顯示出來; 
    反向引用的示d


10. grep -iE '(he)|(it)' if.sh
    搜尋含有he或He, it或It的行並顯示出來


11. grep '[[:digit:]]' if.sh
    搜尋含有數字的行並顯示出來


正則表示式內建的表示式語法:
特殊符號代表意義
[:alnum:]代表英文大小寫位元組及數字,亦即 0-9, A-Z, a-z
[:alpha:]代表任何英文大小寫位元組,亦即 A-Z, a-z
[:blank:]代表空白鍵與 [Tab] 按鍵兩者
[:cntrl:]代表鍵盤上面的控制按鍵,亦即包括 CR, LF, Tab, Del.. 等等
[:digit:]代表數字而已,亦即 0-9
[:graph:]除了空白位元組 (空白鍵與 [Tab] 按鍵) 外的其他所有按鍵
[:lower:]代表小寫位元組,亦即 a-z
[:print:]代表任何可以被列印出來的位元組
[:punct:]代表標點符號 (punctuation symbol),亦即:" ' ? ! ; : # $...
[:upper:]代表大寫位元組,亦即 A-Z
[:space:]任何會產生空白的位元組,包括空白鍵, [Tab], CR 等等
[:xdigit:]代表 16 進位的數字型別,因此包括: 0-9, A-F, a-f 的數字與位元組


正則的表示法:
pattern正則表示式主要引數:
\: 忽略正則表示式中特殊字元的原有含義。
^: 匹配正則表示式的開始行。
$:  匹配正則表示式的結束行。
\<:從匹配正則表達 式的行開始。
\>:到匹配正則表示式的行結束。
[ ]:單個字元,如[A]即A符合要求 。
[ - ]:範圍,如[A-Z],即A、B、C一直到Z都符合要求 。
. : 所有的單個字元。
* :有字元,長度可以為0


說明:
Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的擴充套件,支援更多的re元字元, fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表示式中的元字元表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F命令列選項來使用egrep和fgrep的功能。


附:
# if.sh
#! /bin/bash
name="csf"
if [ $name == "csf" ]
then
    echo "Hello, $name"
fi
# It is often wet in the West. And It's often cold in the North.


---------------------- 基礎正則表示式 ----------------------------------------
元字元功能    示例示例的匹配物件
^行首定位符    /^csf/匹配所有以csf開頭的行


$行尾定位符    /csf$/匹配所有以csf結尾的行


.匹配除換行符    /l..e/      匹配包含字母l,後跟任意兩個字元, \
            外單個字元                  後面再接一個字母e.


*           匹配零個或任    / *csf/    匹配零個或多個空格緊跟著模式csf \
            意個前導字元                的行.


[]          匹配指定字元    /[Ll]ove/   匹配包含csf或Love的行
            組內的任一個


[^]         匹配不在指定    /[^A-KM-Z]ove/   匹配包含ove,但前面不能是A-K \
            字元組內的任                     M-Z之間的字元
            一個.


\<          詞首定位符      /\<csf/         匹配以csf開頭的單詞


\>          詞尾定位符      /csf\>/        匹配以csf結尾的單詞


------------------------- 擴充套件正則表示式 -------------------------------
元字元功能    示例示例的匹配物件
+           匹配一個或多
            個前導字元


?           匹配一個或零
            個前導字元


a|b         匹配a或b


()          把若干個字元作為一個整體


\(...\)     儲存已匹配的字元  s/\(csf\)lxy/\1er/ 把csflxy替換成csfer


x\{m\}    連續m個x


x\{m,}     至少m個x


x\{m,n\}  至少m個x, 但不超過n


\w         所有字母與數字


\W          所有字母與數字外的字元


\b          詞邊界