✔ 最佳答案
第一點, 你第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.