grep は、別名が「grep -R」の場合、パイプを無視します。

grep は、別名が「grep -R」の場合、パイプを無視します。

grep検索の出力を別のgrepの入力にリンクしようとしています。たとえば、

grep search_query * | grep -v but_not_this

ただし、2 番目の grep は前の検索の出力を使用しません。 2番目のgrepは代わりに*を使用しているようです。例えば、

grep lcov *                                                                                          
tst/bits/Module.mk:21:$(call func_report_lcov)
tst/drivers/Module.mk:27:$(call func_report_lcov)

ただし、「call」を含む結果をフィルタリングするには

grep lcov * | grep -v call
...

私をつかんで私のワークスペースのすべての行「電話」は含まれません。

環境情報:

  • これはbashとFishの両方で起こります。
  • 以下のようにgrepコマンドのエイリアスを設定しました。alias grep='grep -nR --color=always'

私が逃した他のものはありますか?

答え1

エイリアシングがその理由です。でman grepこの-Rオプションを使用すると、grep「各ディレクトリの下のすべてのファイルを繰り返し読み込みます」。したがって、パイプの次の部分は最初の出力を無視し、grep代わりにgrep現在のディレクトリ内のすべてのファイルを繰り返し繰り返します。

エイリアスをバイパスし、バニラ grep と\grep

grep lcov * | \grep -v call

しかし、個人的に-R別名を入力するのは混乱していると思います。

答え2

興味深い。これ現れる詳細は文字通り悪魔のように見えます。

grep "search_query" *

可能とは違う

grep search_query *

どの可能そして他

grep 'search_query' *

この試み:

grep search_query * > /tmp/foo
grep -v but_not_this /tmp/foo

ファイルに/tmp/foo必要な内容が含まれていますか?希望の答えを得ました
か? unaliasに置き換えて動作していることを確認してください。 grep -v but_not_this
grep\grep

関連情報