2011-05-26 74 views
6

我一個管道命令egrep的,我使用,以確保特定的故障字符串沒有出現在其中的一些輸出。grep的顯示所有行,而不僅僅是匹配,設置退出狀態

的不幸的是,命令本身在失敗時不會返回適當的非零退出狀態,這就是我這樣做的原因。

command | egrep -i -v "badpattern" 

以此爲據可以作爲給我的退出代碼我要(1如果badpattern在輸出中出現,否則爲0),但是,它只會不匹配模式輸出線(如-v開關被設計來做)。爲了我的需要,這些線條是最有趣的線條。

有沒有辦法讓grep只是盲目地通過全部作爲輸入得到的代碼行,只要給我適當的退出代碼?

如果沒有,我想我可以使用perl -ne「print;如果/ badpattern /出口1」。我使用-n而不是-p,因爲-p不會打印違規行(因爲它在運行單行程後打印)。所以,我用-n和調用print自己,這至少給我的第一個問題的行,但隨後輸出(和執行)停在那裏,所以我不得不這樣做

perl -e '$code = 0; while (<>) { print; $code = 1 if /badpattern/; } exit $code'

這做了整個交易,但有點多,有沒有一個簡單的命令行開關的grep,只會做我在找什麼?

回答

4

其實,你的Perl的想法是不壞。嘗試:

perl -pe 'END { exit $status } $status=1 if /badpattern/;' 

我敢打賭,這至少與建議的其他選項一樣快。

+0

很酷,至少比我的perl one liner還短。 – hsiu 2011-05-27 13:25:15

1

如何做一個重定向到/ dev/null,因此刪除所有行,但你仍然得到退出代碼?

$ grep spam .bashrc > /dev/null 

$ echo $? 
1 

$ grep alias .bashrc > /dev/null 

$ echo $? 
0 

或者你可以簡單地使用-q開關

-q, --quiet, --silent 
      Quiet; do not write anything to standard output. Exit 
      immediately with zero status if any match is found, even if an 
      error was detected. Also see the -s or --no-messages option. 
      (-q is specified by POSIX.) 
+0

但我_do_想看到所有行。我不想過濾行,我只是想掃描它們,如果有匹配,請將退出代碼設置爲非零。但是不管怎樣,所有行都應該輸出。 – hsiu 2011-05-26 21:58:37

+0

Missunderstood您的Q完全,如果你知道輸出的長度,你可以做這樣的'grep別名-A1000 -B1000'即顯示1k行高於和低於匹配即所有輸出 – 2011-05-26 22:06:54

2
$ tee /dev/tty < ~/.bashrc | grep -q spam && echo spam || echo no spam 
+0

因此,最後一部分是不必要的,但是第一部分作品......有時。我不明白這一點,但如果我做一個echo badpattern | tee/dev/tty | grep -q -v badpattern,它的工作原理。但是,如果我將「badpattern」放在一個帶有其他東西的文件中,並執行cat bpfile | tee/dev/tty | grep -q -v badpattern,它停止工作,退出狀態總是返回0.所以,我很難知道它是否適用於我從curl返回的內容(我使用的第一個命令)或不是。 – hsiu 2011-05-26 22:18:56

相關問題