語法:[root @test /root ]# grep [-acinv] '搜尋字符串' filenames-list 參數說明: -a :將 binary 文件以 text 文件的方式搜尋數據 -c :計算找到 '搜尋字符串' 的次數 -i :忽略大小寫的不一樣,因此大小寫視爲相同 -n :順便輸出行號 -v :反向選擇,亦即顯示出沒有 '搜尋字符串' 內容的那一行! 範例: [root @test /root]# grep 'root' /var/log/secure 搜索 /var/log/secure 這個文件中包含 root 的行 [root @test /root]# grep -v 'root' /var/log/secure 搜索沒有 root 的行 [root @test /root]# grep [A-Z]ANPATH /etc/man.config 說明:grep 是一個很常見的指令,最重要的功能就是進行字符串數據的比對了,須要說明的是『grep 在一個文件中查尋一個字符串時,他是以"整行"爲單位來數據的擷取的!』 grep 是最簡單的正規表示法搜尋指令之一,他並不支持一些更嚴謹的正規表示法內容,不過,已經至關的好用。 例題一:找出這個文件裏面含有 know 這個字符,並將行號列出來:注意,大小寫是不同的 [root @test /root ]# grep -n 'know' regexp.txt 例題二:找出這個文件裏面含有 * 這個字符,並將行號列出來: [root @test /root ]# grep -n '\*' regexp.txt 例題三:我要將全部 know 不論大小寫都列出來,並列出行號: [root @test /root]# grep -ni 'know' regexp.txt 注意:相似的指令還有egrep、awk、gawk、sed等,將在後面詳細說明 5 正規表示法的特殊字符(charaters)與 egrep 指令 特殊字符 表示意義 ^word 待搜尋的字符在行首 word$ 待搜尋的字符在行尾 . 匹配任何一個可能的字符 \ 跳脫符號將特殊字符變成普通字符 ? 任何一個『單一』字符 * 匹配模式中重複的字符 [list] 列表中的字符 [range] 列表中範圍內的字符 [^list] 反向選擇,與 [list] 相反 [^range] 反向選擇,與 [range]相反 \{n\} 與前一個相同字浮連續 n 個 \{n,m\} 與前一個相同字浮連續 n-m 個 請特別留意的是,『正規表示法的特殊字符』與通常在指令列輸入指令的『萬用字符』並不相同,例如,在萬用字符當中, * 表明的是 0 ~ 無限多個字符的意思,可是在正規表示法當中, * 則是重複前一個字符的意思~使用的意義並不相同,不要搞混了! 例題:在 /etc 底下,只要含有 XYZ 三個字符的任何一個字符的那一行就列出來 grep [XYZ] /etc/* 例題:我想要知道在 /etc 裏面,只要句首是 w-z 的就將他印出來? grep ^[w-z] /etc/* 6 diff比較兩個文件內容是否有不一致的指令! 語法:[root @test /root ]# diff file1 file2 範例:[root @test /root]# diff index.htm index.html 例子:ls –l | grep ‘^d’ 查詢子目錄 注意:使用規則表達式要養成良好的習慣,就是在匹配模式的兩端加上‘’。這樣和shell的文件通配符號作區別。 7 充分規則表達式專用字符 符號 執行 pattern1 | pattern2 邏輯或 (patten) 對模式進行分組 char+ 搜索前面字符的一個或者多個重複實例 char? 搜索前面字符的一個或者0個實例 例題:t+ 匹配一個或一個以上連續的t,如t tt ttt t? 匹配0個或1個t 如 t 或 ‘ ’ 「create | stream 「 和兩種模式的任一種進行匹配 重點回顧 • shell文件匹配字符和規則表達式的區別 shell文件匹配字符是用於匹配文件名 正規表示法RE的用途主要是用來作爲『搜尋』字符串之用,匹配的文件裏面的內容和用來過濾特殊訊息等用途; • 因爲嚴謹度的不一樣,正規表示法之上還有更嚴謹的延伸正規表示法; • 正規表示法的處理方式,常常是以『整行』或稱爲『整段』來進行處理的; • grep 與 egrep 在正規表示法裏面是很常見的兩支程序,其中, egrep 能夠用不一樣的模式去匹配,以及支持更嚴謹的正規表示法的語法。