Linux 的grep command 一問(10分)

2007-01-31 12:03 am
請問以下兩句grep commands有何分別:
1. grep -qiE '\\*|ERROR' file-xxx |grep -vi "JOB END";echo $? no-echo
2. grep -iE '\\\\*|ERROR' file-xxx |grep -vi "JOB END" >/dev/null;echo $?

回答 (1)

2007-02-01 5:26 am
✔ 最佳答案
第一點, 你第2 包個 regular expression 比第一句開始多左個反鈄線 (\), 所以兩句grep 既野好唔同。 第一句 \*|ERROR 會搵任何包括 ERROR 這字或 星號(*)的行,第二句多左個 \ ,變左 escape 左第一個 \ ,變左搵任何包括ERROR字串或 0 至無限咁多個反鈄線。因為反鈄線可以連續重覆0次 (即無出現過都得), 變左你 pass 乜佢, 佢都會match到。 當然,我覺得你係 typo, 打多左個反鈄線。

你可以比對:

echo abcde | grep -E '\*'

同:

echo abcde | grep -E '\\*'

的分別

如果你兩句 regular expression 都一模一樣, 第一句亦無 之後個 no-echo,原則上兩句括表現都大致相同。不過第一句係大部份情況會比第二句快同慳 resource, 因為:

A. 第一句你用 -q 令佢無output, 但第二句用 I/O redirection 將個output轉入黑洞設備/dev/null 來佢無output。對grep 個 program 來說,佢仍然會用少少 resource 去 call puts 之類 function 去輸出match到既行。在第一句中grep就連call puts/printf之類都慳番。 系統本身亦唔需要 handle 做 I/O redirection 既額外工作,所以會慳resource 和快左。

B. -q 選項令 grep 搵到第一個match到 regular expression 既行就會立即停手並return 0。第二句無 -q 既 grep 就會一路搵直到搵晒所有match 既行為止。
咁明顯,第一句會快 d。

你可以打下:

time grep -qiE '\*|ERROR' file-xxx |grep -vi 'JOB END'
time grep -iE '\\*|ERROR' file-xxx |grep -vi 'JOB END' >/dev/null

就睇到兩句既分別

2007-02-08 23:07:27 補充:
sure, -q is not a standard option is all Unix. While you mention it is Linux and mention -q, I suppose you are using GNU grep, which support -q. If you want, you can compile the GNU grep for most Unix systems.


收錄日期: 2021-04-18 20:40:45
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20070130000051KK01618

檢視 Wayback Machine 備份