相信
grep
是unix
和linux
中使用最廣泛的命令之一。
grep
(全域性正規表示式版本)允許
對文字檔案進行模式查詢。如果找到匹配模式,
grep
列印包含模式的所有行。
grep
支援基本正
則表示式,也支援其擴充套件集。
本文主要討論以下內容:
• grep(引數)選項。
• 匹配grep的一般模式。
• 只匹配字母或數字,或兩者混用。
• 匹配字串範圍。
1. grep
grep 一般格式為:
grep [選項]基本正規表示式[檔案]
2.雙引號的使用
在grep命令中輸入字串引數時,最好將其用雙引號括起來。例如:「mystring」。這樣做有兩個原因,一是以防被誤解為shell命令,二是可以用來查詢多個單詞組成的字串,例如:「jetplane」,如果不用雙引號將其括起來,那麼單詞plane將被誤認為是乙個檔案,查詢結果
將返回「檔案不存在」的錯誤資訊。在呼叫變數時,也應該使用雙引號,諸如:grep「$myvar」檔名,如果不這樣,將沒有返回結果。
在呼叫模式匹配時,應使用單引號。
3.grep選項
常用的grep選項有:
-c 只輸出匹配行的計數。
-i 不區分大小寫(只適用於單字元)。
-h 查詢多檔案時不顯示檔名。
-l 查詢多檔案時只輸出包含匹配字元的檔名。
-n 顯示匹配行及行號。
-s 不顯示不存在或無匹配文字的錯誤資訊。
-v 顯示不包含匹配文字的所有行。
4. grep舉例
4.1 多檔案查詢
$ grep "sort"*.doc
或在所有檔案中查詢單詞「 sort it」
$ grep "sort it" *
$ grep -c "48"data.f
$ 4grep返回數字4,意義是有4行包含字串「48」
顯示滿足匹配模式的所有行行數
[root@localhost /]# grep -n "48" data.f
1:48 dec 3bc1997 lpsx 68.00 lvx2a 138
2:483 sept 5ap1996 usp 65.00 lvx2c 189
5:484 nov 7pl1996 cad 49.00 plv2c 234
6:483 may 5pa1998 usp 37.00 kvm9d 644
顯示不匹配的行
[root@localhost /]# grep -v "48" data.f
47 oct 3zl1998 lpsx 43.00 kvm9d 512
219 dec 2cc1999 cad 23.00 plv2c 68
216 sept 3zl1998 usp 86.00 kvm9e 234
大小寫敏感
[root@localhost /]# grep -i "sept" data.f
483 sept 5ap1996 usp 65.00 lvx2c 189
216 sept 3zl1998 usp 86.00 kvm9e 234
5.正規表示式
5.1 模式匹配
假定要抽取**為484和483的城市位置,上一章中講到可以使用[ ]來指定字串範圍,這裡用48開始,以3或4結尾,這樣抽出484或483。
[root@localhost /]# grep "48[34]" data.f
483 sept 5ap1996 usp 65.00 lvx2c 189
484 nov 7pl1996 cad 49.00 plv2c 234
483 may 5pa1998 usp 37.00 kvm9d 644
不匹配行首 如果要抽出記錄,使其行首不是48,可以在方括號中使用^記號,表明查詢在行首開始。
[root@localhost /]# grep '^[^48]' data.f
219 dec 2cc1999 cad 23.00 plv2c 68
216 sept 3zl1998 usp 86.00 kvm9e 234
匹配任意字元
如果抽取以k開頭,以d結尾的所有**,可使用下述方法,因為已知**長度為5個字元:
[root@localhost /]# grep 'k...d' data.f
47 oct 3zl1998 lpsx 43.00 kvm9d 512
483 may 5pa1998 usp 37.00 kvm9d 644
日期查詢
乙個常用的查詢模式是日期查詢。先查詢所有以5開始以1996或1998結尾的所有記錄。使用模式5..199[6,8]。這意味著第乙個字元為5,後跟兩個點,接著是199,剩餘兩個數字是6或8。
[root@localhost /]# grep '5..199[68]' data.f
483 sept 5ap1996 usp 65.00 lvx2c 189
483 may 5pa1998 usp 37.00 kvm9d 644
模式出現機率
抽取包含數字4至少重複出現兩次的所有行,方法如下:
[root@localhost /]# grep '4/' data.f
483 may 5pa1998 usp 37.00 kvm9d 644
使用grep匹配「與」或者「或」模式
[root@localhost /]# grep -e '216|219' data.f
219 dec 2cc1999 cad 23.00 plv2c 68
216 sept 3zl1998 usp 86.00 kvm9e 234
使用grep匹配「與」或者「或」模式
[root@localhost /]# grep -e '216|219' data.f
219 dec 2cc1999 cad 23.00 plv2c 68
216 sept 3zl1998 usp 86.00 kvm9e 234
6 類名
類等價的正規表示式類等價的正規表示式
[[:upper:]] [a-z]
[[:lower:]] [a-z]
[[:alnum:]] [0-9a-za-z]
[[:space:]] 空格或tab鍵
[[:digit:]] [0-9]
[[:alpha:]] [a-za-z]
7 總結
希望大家已經理解了grep的靈活性,它是乙個很強大而流行的工具,像其他許多unix工具一樣,已經被使用在dos中。如果要通過檔案快速查詢字串或模式, grep是乙個很好的選擇。簡單地說, grep是shell程式設計中很重要的工具。
shell 指令碼 系統檢測
bin bash 介面輸出區 optimize 函式命令區 order ip get sed s space g grep v lo echo read ep 請選擇您想要獲取ip的網絡卡名稱 wangka zw ifconfig grep n1 wangka grep inet awk ip if...
Linux Shell指令碼系列之一
shell的分類 使用tab鍵 進行命令和檔案目錄的補全,若當前匹配的有多個則再摁多一次,則會列出所有匹配的檔案或目錄 輸入重定向 wc 選項 檔名 選項 c 統計位元組數 w 統計單詞數 l 統計行數 管道符命令1 命令2 命令1的正確輸出作為命令2的操作物件 舉個栗子3 萬用字元?匹配乙個任意字...
shell指令碼學習(二) grep
1.grep egrep c 列印符合要求的行數 n 在輸出符合要求的行的同時連同行號一起輸出 v 列印不符合要求的行 r 會把目錄下面所有的檔案全部遍歷一遍 i 忽略大小寫 2.例子介紹 grep n root 1.txt grep n v root 1.txt 過濾出所有包含數字行 grep n...