linux 命令之 Grep 詳解
1 引言
Grep (global search regular expression(RE) and print out the line,全面搜索正則表達式并 把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。Grep 家族包括Grep、 eGrep 和fGrep。eGrep 和fGrep 的命令只跟Grep 有很小不同。 eGrep 是Grep 的擴展,支持更多的re 元字符, fGrep 就是 fixed Grep 或fast Grep,它們把所有的字母都看作單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,不再特殊。linux 使用GNU 版本的Grep。它功能更強,可以通過-G、-E、-F 命令行選項來使用eGrep 和fGrep 的功能。Grep 的工作方式是這樣的,它在一個或多個文 中搜索字符串模板。如果模板包括空格,則必須被引用,模板后的所有字符串被看作文件名。搜索的結果被送到屏幕,不影響原文件內容。Grep 可用于shell 腳本,因為Grep 通過返回一個狀態值來說明搜索的狀態,如果模板搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文 不存在,則返回2 。我們利用這些返回值就可進行一些自動化的文本處理工作。 </span>2 Grep 詳解
功能說明:查找文件里符合條件的字符串。
語 法:grep [-abcEFGhHilLnqrsvVwxy][-A<顯示列數>][-B<顯示列數>][-C<顯示列數>][-d<進行動作>][-e<范本樣式>][-f<范本文件>][--help][范本樣式][文件或目錄...]
補充說明:grep指令用于查找內容包含指定的范本樣式的文件,如果發現某文件的內容符合所指定的范本樣式,預設grep指令會把含有范本樣式的那一列顯示出來。若不指定任何文件名稱,或是所給予的文件名為“-”,則grep指令會從標準輸入設備讀取數據。
參 數:
-a或--text 不要忽略二進制的數據。-A<顯示列數>或--after-context=<顯示列數> 除了顯示符合范本樣式的那一列之外,并顯示該列之后的內容。
-b或--byte-offset 在顯示符合范本樣式的那一列之前,標示出該列第一個字符的位編號。
-B<顯示列數>或--before-context=<顯示列數> 除了顯示符合范本樣式的那一列之外,并顯示該列之前的內容。
-c或--count 計算符合范本樣式的列數。
-C<顯示列數>或--context=<顯示列數>或-<顯示列數> 除了顯示符合范本樣式的那一列之外,并顯示該列之前后的內容。
-d<進行動作>或--directories=<進行動作> 當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep指令將回報信息并停止動作。
-e<范本樣式>或--regexp=<范本樣式> 指定字符串做為查找文件內容的范本樣式。
-E或--extended-regexp 將范本樣式為延伸的普通表示法來使用。
-f<范本文件>或--file=<范本文件> 指定范本文件,其內容含有一個或多個范本樣式,讓grep查找符合范本條件的文件內容,格式為每列一個范本樣式。
-F或--fixed-regexp 將范本樣式視為固定字符串的列表。
-G或--basic-regexp 將范本樣式視為普通的表示法來使用。
-h或--no-filename 在顯示符合范本樣式的那一列之前,不標示該列所屬的文件名稱。
-H或--with-filename 在顯示符合范本樣式的那一列之前,表示該列所屬的文件名稱。
-i或--ignore-case 忽略字符大小寫的差別。
-l或--file-with-matches 列出文件內容符合指定的范本樣式的文件名稱。
-L或--files-without-match 列出文件內容不符合指定的范本樣式的文件名稱。
-n或--line-number 在顯示符合范本樣式的那一列之前,標示出該列的列數編號。
-q或--quiet或--silent 不顯示任何信息。
-r或--recursive 此參數的效果和指定“-d recurse”參數相同。
-s或--no-messages 不顯示錯誤信息。
-v或--revert-match 反轉查找。
-V或--version 顯示版本信息。
-w或--word-regexp 只顯示全字符合的列。
-x或--line-regexp 只顯示全列符合的列。
-y 此參數的效果和指定“-i”參數相同。
--help 在線幫助。</span>
3 grep 實戰
開始實戰,我是直接在linux text模式啟動,你可以自己找到一個測試目錄,第一步執行命令:
vi 1.txt
上面這句命令的意思是:如果1.txt存在就打開,不存在就創建并打開接著按一下鍵盤的s鍵,看見linux屏幕左下角提示“---插入---”,表明當前已經變成插入模式,接著,大家鼠標右鍵復制一下下面的這段文本,
在linux屏幕里點擊鼠標右鍵,內容就粘帖進去了。
然后大家按一下鍵盤的“ESC”鍵,然后輸入一個冒號”:“ 屏幕里出現冒號之后,輸入:wq,提示已寫入。并已退出vi編輯模式。
安徽省 Anhuisheng
澳門特別行政區 Aomen Tebie Xingzhengqu
北京市 Beijingshi
重慶市 Chongqingshi
福建省 Fujiansheng
甘肅省 Gansusheng
廣東省 Guangdongsheng
廣西壯族自治區 Guangxi Zhuangzu zizhiqu
貴州省 Guizhousheng
海南省 Hainansheng
河北省 Hebeisheng
黑龍江省 Heilongjiangsheng
河南省 Henansheng
湖北省 Hubeisheng
湖南省 Hunansheng
江蘇省 Jiangsusheng
江西省 Jiangxisheng
吉林省 Jilinsheng
遼寧省 Liaoningsheng
內蒙古 Neimenggu zizhiqu
寧夏回族自治區 Ningxia Huizu zizhiqu
青海省 Qinghaisheng
陜西省 Shaanxisheng
山東省 Shandongsheng
上海市 Shanghaishi
山西省 Shanxisheng
四川省 Sichuansheng
臺灣省 Taiwansheng
天津市 Tianjinshi
香港特別行政區 Xianggang Tebie Xingzhengqu
新疆維吾爾族自治區 Xinjiang Weiwu’erzu zizhiqu
西藏自治區 Xizang zizhiqu
云南省 Yunnansheng
浙江省 Zhejiangsheng
接著執行命令:cp 1.txt 2.txt
復制一份1.txt命名為2.txt , 好了 ,練習開始。p1:多文件查詢
在1.txt和2.txt中查詢出包含”區"的行:
[channel@localhost kingviker]$ grep '區' 1.txt 2.txt
1.txt:澳門特別行政區 Aomen Tebie Xingzhengqu
1.txt:廣西壯族自治區 Guangxi Zhuangzu zizhiqu
1.txt:寧夏回族自治區 Ningxia Huizu zizhiqu
1.txt:香港特別行政區 Xianggang Tebie Xingzhengqu
1.txt:新疆維吾爾族自治區 Xinjiang Weiwu’erzu zizhiqu
1.txt:西藏自治區 Xizang zizhiqu
2.txt:澳門特別行政區 Aomen Tebie Xingzhengqu
2.txt:廣西壯族自治區 Guangxi Zhuangzu zizhiqu
2.txt:寧夏回族自治區 Ningxia Huizu zizhiqu
2.txt:香港特別行政區 Xianggang Tebie Xingzhengqu
2.txt:新疆維吾爾族自治區 Xinjiang Weiwu’erzu zizhiqu
2.txt:西藏自治區 Xizang zizhiqu
或者查詢出當前文件夾下的所有文件中包含“區” 的行:[channel@localhost kingviker]$ grep '區' *
1.txt:澳門特別行政區 Aomen Tebie Xingzhengqu
1.txt:廣西壯族自治區 Guangxi Zhuangzu zizhiqu
1.txt:寧夏回族自治區 Ningxia Huizu zizhiqu
1.txt:香港特別行政區 Xianggang Tebie Xingzhengqu
1.txt:新疆維吾爾族自治區 Xinjiang Weiwu’erzu zizhiqu
1.txt:西藏自治區 Xizang zizhiqu
2.txt:澳門特別行政區 Aomen Tebie Xingzhengqu
2.txt:廣西壯族自治區 Guangxi Zhuangzu zizhiqu
2.txt:寧夏回族自治區 Ningxia Huizu zizhiqu
2.txt:香港特別行政區 Xianggang Tebie Xingzhengqu
2.txt:新疆維吾爾族自治區 Xinjiang Weiwu’erzu zizhiqu
2.txt:西藏自治區 Xizang zizhiqu
p2:行匹配
查詢1.txt中包含“區"關鍵字的總行數,我們可以使用-c來顯示行數。
[channel@localhost kingviker]$ grep -c '區' 1.txt
6
我們可以使用-n開關啦控制是否顯示行號,這個行號是在文件里的實際的行號。
[channel@localhost kingviker]$ grep -n '區' 1.txt
2:澳門特別行政區 Aomen Tebie Xingzhengqu
8:廣西壯族自治區 Guangxi Zhuangzu zizhiqu
21:寧夏回族自治區 Ningxia Huizu zizhiqu
30:香港特別行政區 Xianggang Tebie Xingzhengqu
31:新疆維吾爾族自治區 Xinjiang Weiwu’erzu zizhiqu
32:西藏自治區 Xizang zizhiqu
p4:顯示非匹配行,也就是結果取反我們可以使用 -v 來取反。
[channel@localhost kingviker]$ grep -v '區' 1.txt
安徽省 Anhuisheng
北京市 Beijingshi
重慶市 Chongqingshi
福建省 Fujiansheng
甘肅省 Gansusheng
廣東省 Guangdongsheng
貴州省 Guizhousheng
海南省 Hainansheng
河北省 Hebeisheng
黑龍江省 Heilongjiangsheng
河南省 Henansheng
湖北省 Hubeisheng
湖南省 Hunansheng
江蘇省 Jiangsusheng
江西省 Jiangxisheng
吉林省 Jilinsheng
遼寧省 Liaoningsheng
內蒙古 Neimenggu zizhiqu
青海省 Qinghaisheng
陜西省 Shaanxisheng
山東省 Shandongsheng
上海市 Shanghaishi
山西省 Shanxisheng
四川省 Sichuansheng
臺灣省 Taiwansheng
天津市 Tianjinshi
云南省 Yunnansheng
浙江省 Zhejiangsheng
p5:精確匹配
我們可以使用\>符號來匹配以區結尾的字符串
[channel@localhost kingviker]$ grep '區\>' 1.txt
澳門特別行政區 Aomen Tebie Xingzhengqu
廣西壯族自治區 Guangxi Zhuangzu zizhiqu
寧夏回族自治區 Ningxia Huizu zizhiqu
香港特別行政區 Xianggang Tebie Xingzhengqu
新疆維吾爾族自治區 Xinjiang Weiwu’erzu zizhiqu
西藏自治區 Xizang zizhiqu
我們可以使用\《符號來匹配以區開頭的字符串,結果為空。p6:大小寫敏感
grep 默認是大小寫敏感的,我們可以使用-i開關來控制,如果不加-i 結果為空:
[channel@localhost kingviker]$ grep -i 'beijing' 1.txt
北京市 Beijingshi
正則表達式
使用正則表達式使模式匹配加入一些規則,因此可以在抽取信息中加入更多選擇。使用正則表達式時最好用單引號括起來,這樣可以防止g r e p 中使用的專有模式與一些s h e l l 命令的特殊方式相混淆。
p1:范圍模式
如果想要查詢‘山東’和‘山西’的列表,可以用[ ]來指定范圍。
[channel@localhost kingviker]$ grep '山[東西]' 1.txt
山東省 Shandongsheng
山西省 Shanxisheng
p2:匹配行首如果想要查詢”山“開頭的省份,
grep '^山' 1.txt
結果同上。如果想查詢非”山“開頭的省份,
這里可以在取反一次,這個只是娛樂
p3:大小寫設置
p6:模式出現幾率
p11:使用通配符*的匹配模式
p14:egrep
[channel@localhost kingviker]$ grep '^[^山]' 1.txt
安徽省 Anhuisheng
澳門特別行政區 Aomen Tebie Xingzhengqu
北京市 Beijingshi
重慶市 Chongqingshi
福建省 Fujiansheng
甘肅省 Gansusheng
廣東省 Guangdongsheng
廣西壯族自治區 Guangxi Zhuangzu zizhiqu
貴州省 Guizhousheng
海南省 Hainansheng
河北省 Hebeisheng
黑龍江省 Heilongjiangsheng
河南省 Henansheng
湖北省 Hubeisheng
湖南省 Hunansheng
江蘇省 Jiangsusheng
江西省 Jiangxisheng
吉林省 Jilinsheng
遼寧省 Liaoningsheng
內蒙古 Neimenggu zizhiqu
寧夏回族自治區 Ningxia Huizu zizhiqu
青海省 Qinghaisheng
陜西省 Shaanxisheng
上海市 Shanghaishi
四川省 Sichuansheng
臺灣省 Taiwansheng
天津市 Tianjinshi
香港特別行政區 Xianggang Tebie Xingzhengqu
新疆維吾爾族自治區 Xinjiang Weiwu’erzu zizhiqu
西藏自治區 Xizang zizhiqu
云南省 Yunnansheng
浙江省 Zhejiangsheng
這里可以在取反一次,這個只是娛樂
[channel@localhost kingviker]$ grep -v '^[^山]' 1.txt
山東省 Shandongsheng
山西省 Shanxisheng
上面提到過了 可以用-i開關控制,也可以用[]包含大小寫來實現:
[channel@localhost kingviker]$ grep 'bei' 1.txt
河北省 Hebeisheng
湖北省 Hubeisheng
[channel@localhost kingviker]$ grep -i 'bei' 1.txt
北京市 Beijingshi
河北省 Hebeisheng
湖北省 Hubeisheng
[channel@localhost kingviker]$ grep '[Bb]ei' 1.txt
北京市 Beijingshi
河北省 Hebeisheng
湖北省 Hubeisheng
p4:匹配任意字符
我們還是查詢以"山"開頭的省份,
p5:范圍組合
[channel@localhost kingviker]$ grep '山.省' 1.txt //這里限制了必須是三個字,點”.”只代表一個字或一個字母。山東省 Shandongsheng 山西省 Shanxisheng我們如果想查詢想查詢,以“山,河,廣'開頭的省份,
[channel@localhost kingviker]$ grep '[山河廣].省' 1.txt
廣東省 Guangdongsheng
河北省 Hebeisheng
河南省 Henansheng
山東省 Shandongsheng
山西省 Shanxisheng
我們想查詢以大寫字母A-L開頭,中間可以出現0到6個小寫字母,包含sh和Sh,并且以i或者eng結尾的結果:
[channel@localhost kingviker]$ grep '[A-L][a-z]\{0,6\}[Ss]h[i,eng]$' 1.txt
北京市 Beijingshi
上面的命令大家可能不懂”\{0,6\}“,現在就說明一下,這個是描述它前面的字母出現的次數,上例子中的意思就是a-z的字母可以連續出現0到6個。如果后邊不寫”\{1,\}"表示至少出現一次的,如果只寫一個數字”\{2\}",表示最只匹配出現2次的結果:
[channel@localhost kingviker]$ grep 'a\{2\}' 1.txt
陜西省 Shaanxisheng
p7:使用grep匹配“與”或者“或”模式,g r e p 命令加- E 參數,這一擴展允許使用擴展模式匹配。
這里想要查詢 “北京,上海”:
[channel@localhost kingviker]$ grep -e '北京|上海' 1.txt
[channel@localhost kingviker]$ grep -E '北京|上' 1.txt
北京市 Beijingshi
上海市 Shanghaishi
[channel@localhost kingviker]$
這個參數是大小寫敏感的 我上一句命令-e 就沒有結果p8:空行
結合使用^和$可查詢空行。使用- c 參數顯示總行數:
p9:匹配特殊字符
查詢有特殊含義的字符,諸如$ . ' " * [] ^ | \ + ? ,必須在特定字符前加\。假設要查詢包含 中文單引號’的 的所有行:
p10:查詢IP 地址
要查看n n n . n n n 網絡地址,如果忘了第二部分中的其余部分,只知有兩個句點,例如n n n . n n . . 。要抽取其中所有nnn.nnn IP 地址,使用[ 0 - 9 ] \ { 3 \ } \ . [ 0 - 0 \ { 3 \ } \。含義是任意數字出現3 次,后跟句點,接著是任意數字出現3 次,后跟句點。
[channel@localhost kingviker]$ grep -c '^$' 1.txt
0
查詢有特殊含義的字符,諸如$ . ' " * [] ^ | \ + ? ,必須在特定字符前加\。假設要查詢包含 中文單引號’的 的所有行:
[channel@localhost kingviker]$ grep '\’' 1.txt
新疆維吾爾族自治區 Xinjiang Weiwu’erzu zizhiqu
p10:查詢IP 地址
要查看n n n . n n n 網絡地址,如果忘了第二部分中的其余部分,只知有兩個句點,例如n n n . n n . . 。要抽取其中所有nnn.nnn IP 地址,使用[ 0 - 9 ] \ { 3 \ } \ . [ 0 - 0 \ { 3 \ } \。含義是任意數字出現3 次,后跟句點,接著是任意數字出現3 次,后跟句點。
grep '[0-9]\{3\}\.[0-9]\{3\}\.' filename
這個很簡單了,但是有一點要說明,星號“*"前要加點'.':
p12:使用$限制字符串結尾
[channel@localhost kingviker]$ grep ".*sheng" 1.txt
安徽省 Anhuisheng
福建省 Fujiansheng
甘肅省 Gansusheng
廣東省 Guangdongsheng
貴州省 Guizhousheng
海南省 Hainansheng
河北省 Hebeisheng
黑龍江省 Heilongjiangsheng
河南省 Henansheng
湖北省 Hubeisheng
湖南省 Hunansheng
江蘇省 Jiangsusheng
江西省 Jiangxisheng
吉林省 Jilinsheng
遼寧省 Liaoningsheng
青海省 Qinghaisheng
陜西省 Shaanxisheng
山東省 Shandongsheng
山西省 Shanxisheng
四川省 Sichuansheng
臺灣省 Taiwansheng
云南省 Yunnansheng
浙江省 Zhejiangsheng
查詢以eng結尾的數據:
p13:定向輸出結果到指定文件
[channel@localhost kingviker]$ grep 'eng$' 1.txt
廣東省 Guangdongsheng
貴州省 Guizhousheng
海南省 Hainansheng
河北省 Hebeisheng
云南省 Yunnansheng
浙江省 Zhejiangsheng
將查詢出以eng結果的行并輸出到3.txt
[channel@localhost kingviker]$ ls
1.txt 2.txt
[channel@localhost kingviker]$ grep 'eng$' 1.txt > 3.txt
[channel@localhost kingviker]$ ls
1.txt 2.txt 3.txt
[channel@localhost kingviker]$ cat 3.txt
廣東省 Guangdongsheng
貴州省 Guizhousheng
海南省 Hainansheng
河北省 Hebeisheng
云南省 Yunnansheng
浙江省 Zhejiangsheng
egrep 代表e x p r e s s i o n 或extended grep,適情況而定。e g r e p 接受所有的正則表達式, e g r e p 的一個顯著特性是可以以一個文本作為保存的字符串,然后將之傳給egrep 作為參數,為此使用- f 開關;egrep只是默認支持正則表達式擴展的,grep默認是不支持的 ,egrep要想支持正則表達式擴展需要加上-
來自:http://blog.csdn.net/kingviker/article/details/7558035
來自:http://blog.csdn.net/kingviker/article/details/7558035
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!