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別名を入力するのは混乱していると思います。

おすすめ記事