リストから3つのパターンを検索したい。タイプしてみた
$ pip3 list | grep -ei foo -ei bar -ei baz
しかし、シェルはbroken pipe error
と大きなTraceback
をスローします。
grep
にパイプで渡されたリストから渡された複数のパターンに対してgrep
をどのように実行しますか?
試してください:
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>.
理由
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
がファイルfoo
、bar
またはbaz
を見つけられなかったためパイプは終了し、終了しました(3つの「ファイルが見つかりません」エラーで)。トレースバックは、Pythonプログラムであるpip3
からのものです(つまり、Pythonコードのどこで障害が発生したかを正確に示しています) 。