Como faço para grep vários padrões de um pipe

2

Eu quero encontrar três padrões em uma lista. Eu tentei digitar

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

mas o shell lança um broken pipe error e um grande Traceback .

Como eu faço grep para vários padrões passados de uma lista canalizada para grep ?

    
por MyWrathAcademia 14.07.2018 / 20:13

2 respostas

4

Tente:

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

Aqui está um exemplo da vida real do meu servidor Arch:

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

SO e grep info:

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>.
    
por 14.07.2018 / 20:15
7

O motivo

grep -ei foo -ei bar -ei baz

não funciona porque a semântica da opção -e é -e PATTERN , como em

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

... que é o que o comando deveria ter parecido. A opção -i (para correspondência insensível a maiúsculas e minúsculas) só precisará ser especificada uma vez e afetará todos os padrões.

Com -ei foo , você solicita que grep procure o padrão i no arquivo foo .

O erro "pipe quebrado" vem de pip3 tentando gravar no final de um pipe morto. O canal está inativo porque grep não encontrou os arquivos foo , bar ou baz e terminou (com três erros "arquivo não encontrado"). O traceback é de pip3 , que é um programa em Python (assim, ele diz exatamente onde, no código Python, a falha aconteceu ao seu lado).

    
por 14.07.2018 / 20:37