我想在列表中找到三种模式。我尝试打字
$ pip3 list | grep -ei foo -ei bar -ei baz
但是 shell 会抛出一个broken pipe error
和一个大的Traceback
。
如何处理grep
从通过管道传递到的列表传递的多个模式grep
?
答案1
尝试:
pip3 list | grep -Ei 'foo|bar|baz'
这是来自我的 Arch 服务器的真实示例:
pip3 list | grep -Ei 'ufw|set'
setuptools 40.0.0
ufw 0.35
操作系统和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>.
答案2
原因
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
,并终止(出现三个“文件未找到”错误)。回溯来自pip3
Python 程序(因此它可以准确地告诉您 Python 代码中的哪个位置发生了错误)。