法無法為您提供實際匹配實例數量 的真實計數。歸根結底,若要對實例計數,您還是要使用 wc 來計數。首先,使用 -o 選項(如果您的版本支持它的話)來運行 grep 命令。此選項僅 輸出匹配的模式,每行一個模式,而不輸出行本身。但是您不能將它與 -c 選項結合使用,因此要使用 wc -l 來對行計數,如以下示例所示:
清單 18. 好習慣 8 的示例:使用 grep 對模式實例計數
~ $ grep -o and tmp/a/longfile.txt | wc -l
3402
~ $
在此例中,調用 wc 要比第二次調用 grep 并插入一個虛擬模式(例如 grep -c)來對行進行匹配和計數稍快一點。
匹配輸出中的某些字段,而不只是對行進行匹配
當您只希望匹配輸出行中特定字段 中的模式時,諸如 awk 等工具要優(yōu)于 grep。
下面經過簡化的示例演示了如何僅列出 12 月修改過的文件。
清單 19. 壞習慣 9 的示例:使用 grep 來查找特定字段中的模式
~/tmp $ ls -l /tmp/a/b/c | grep Dec
-rw-r--r-- 7 joe joe 12043 Jan 27 20:36 December_Report.pdf
-rw-r--r-- 1 root root 238 Dec 03 08:19 README
-rw-r--r-- 3 joe joe 5096 Dec 14 14:26 archive.tar
~/tmp $
在此示例中,grep 對行進行篩選,并輸出其修改日期和名稱中帶 Dec 的所有文件。因此,諸如 December_Report.pdf 等文件是匹配的,即使它自從一月份以來還未修改過。這可能不是您希望的結果。為了匹配特定字段中的模式,最好使用 awk,其中的一個關系運算符對確切的字段進行匹配,如以下示例所示:
清單 20. 好習慣 9 的示例:使用 awk 來查找特定字段中的模式
~/tmp $ ls -l | awk ''$6 == "Dec"''
-rw-r--r-- 3 joe joe 5096 Dec 14 14:26 archive.tar
-rw-r--r-- 1 root root 238 Dec 03 08:19 README
~/tmp $
停止對 cat 使用管道
grep 的一個常見的基本用法錯誤是通過管道將 cat 的輸出發(fā)送到 grep 以搜索單個文件的內容。這絕對是不必要的,純粹是浪費時間,因為諸如 grep 這樣的工具接受文件名作為參數。您根本不需要在這種情況下使用 cat,如以下示例所示:
清單 21. 好習慣和壞習慣 10 的示例:使用帶和不帶 cat 的 grep
~ $ time cat tmp/a/longfile.txt | grep and
2811
real 0m0.015s
user 0m0.003s
sys 0m0.013s
~ $ time grep and tmp/a/longfile.txt
2811
real 0m0.010s
user 0m0.006s
sys 0m0.004s
~ $
此錯誤存在于許多工具中。由于大多數工具都接受使用連字符 (-) 的標準輸入作為一個參數,因此即使使用 cat 來分散 stdin 中的多個文件,參數也通常是無效的。僅當您使用帶多個篩選選項之一的 cat 時,才真正有必要在管道前首先執(zhí)行連接。
結束語:養(yǎng)成好習慣
最好檢查一下您的命令行習慣中的任何不良的使用模式。不良的使用模式會降低您的速度,并且通常會導致意外錯誤。本文介紹了 10 個新習慣,它們可以幫助您擺脫許多最常見的使用錯誤。養(yǎng)成這些好習慣是加強您的 UNIX 命令行技能的積極步驟。
億恩科技地址(ADD):鄭州市黃河路129號天一大廈608室 郵編(ZIP):450008 傳真(FAX):0371-60123888
聯(lián)系:億恩小凡
QQ:89317007
電話:0371-63322206 本文出自:億恩科技【www.cmtents.com】
服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]
|