web-dev-qa-db-ja.com

パイプから複数のパターンをgrepする方法

リストから3つのパターンを検索したい。タイプしてみた

$ pip3 list | grep -ei foo -ei bar -ei baz

しかし、シェルはbroken pipe errorと大きなTracebackをスローします。

grepにパイプで渡されたリストから渡された複数のパターンに対してgrepをどのように実行しますか?

3
MyWrathAcademia

試してください:

pip3 list | grep -Ei 'foo|bar|baz'

これが私のArchサーバーからの実際の例です:

pip3 list | grep -Ei 'ufw|set'
setuptools 40.0.0 
ufw        0.35   

OSおよびgrep情報:

uname -a
Linux archlinux 4.16.6-1-Arch #1 SMP PREEMPT Mon Apr 30 12:30:03 UTC 2018 x86_64 GNU/Linux

grep --version
grep (GNU grep) 3.1
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
6
maulinglawns

理由

grep -ei foo -ei bar -ei baz

動作しないのは、次のように、-eオプションのセマンティクスが-e PATTERNであるためです。

grep -i -e foo -e bar -e baz

...これは、コマンドがどのように見えるべきであったかです。 -iオプション(大文字と小文字を区別しないマッチングの場合)は、一度だけ指定する必要があり、すべてのパターンに影響します。

-ei fooを使用すると、grepにファイルiでパターンfooを探すように要求します。

「壊れたパイプ」エラーは、死んだパイプの最後に書き込もうとしたpip3が原因です。 grepがファイルfoobarまたはbazを見つけられなかったためパイプは終了し、終了しました(3つの「ファイルが見つかりません」エラーで)。トレースバックは、Pythonプログラムであるpip3からのものです(つまり、Pythonコードのどこで障害が発生したかを正確に示しています) 。

7
Kusalananda