Shell

如何從管道中 grep 多個模式

  • July 14, 2018

我想在列表中找到三個模式。我試著打字

$ 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   

作業系統和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找不到文件foobarbaz,並終止(出現三個“找不到文件”錯誤)。追溯來自pip3哪個 Python 程序(因此它可以準確地告訴您故障發生在 Python 程式碼的哪個位置)。

引用自:https://unix.stackexchange.com/questions/456328