grep: exibe todas as saídas, mas destaca as correspondências da pesquisa

39

no bash, se eu quiser executar um comando e exibir apenas linhas de saída que correspondam a um determinado padrão, posso canalizá-lo para grep, como

arquivo testfile

hello
there
my
friends

comando

$ cat testfile | grep 'hello'
hello #this will be highlightd

isso destacará a correspondência de pesquisa e exibirá toda a linha em que ela se encaixa. Eu posso usar -Ae -Bexibir linhas antes e depois dessa linha. Minha pergunta é: é possível executar o comando e exibir todas as saídas normalmente, mas destacar as correspondências de pesquisa como grep faria? então minha saída seria

hello #highlighted
there
my
friends
ewok
fonte

Respostas:

38

Para usar um Color GREP para destacar apenas padrões correspondentes, mas sem alterar a saída:

grep --color=always -e "^" -e "hello" testfile

O primeiro padrão corresponderá a todas as linhas (todas as linhas serão impressas); o segundo padrão (e qualquer outro padrão a seguir) fará com que o texto correspondente seja destacado em cores.

Como o primeiro padrão corresponde a todas as linhas, mas não corresponde a um caractere imprimível, ele não adiciona nenhum destaque de cor para não competir / interferir na legibilidade do texto destacado.

bot779
fonte
Funciona com kubectl kubectl apply -k . | grep --color=always -e "^" -e "configured"em zsh
Michael Cole
Para uso no Bash: realce () {grep --color = sempre -e "^" -e $ *; }
Jon
Isso funciona no FreeBSD também, você só precisa trocar o primeiro e o segundo padrão ( "^"precisa ser o segundo).
Marián Černý
25

Adicione opção -zao seu comando GNU grep:

cat testfile | grep --color=always -z 'hello'

ou mais curto

grep --color=always -z 'hello' testfile
Cyrus
fonte
3
Este é um hack muito bruto. Ele tem o efeito de tratar o arquivo inteiro como uma única linha. Portanto, (1) se o arquivo for muito grande, pode haver uma possibilidade de ficar sem memória, e (2) se o arquivo não contém o padrão de todo , então nada será emitido.
G-Man diz 'Reinstate Monica'
Em qual versão do grep isso é suportado? Em grep 2.5.4, -z não parece disponível ...
Alex
@ Alex: Eu usei o GNU grep versão 2.6.3.
Cyrus
2
@ G-Man: mais economia de recursos:grep --color "hello\|$" file
Cyrus
@Cyrus: Sim, essa é uma resposta melhor. Infelizmente, é essencialmente equivalente à resposta de bot779 a essa pergunta e quase idêntica às respostas aceitas ( 1 e 2 ) às perguntas às quais vinculei .
G-Man diz 'Reinstate Monica'
4

Da mesma forma que a resposta anterior, você pode pegar todo o $final das linhas:

cat testfile | grep --color -E "hello|$"

-E(ou --extended-regexp) significa que caracteres especiais devem ser escapados \. Ao usá-lo, |será tratado como condição regex "OR".

O Grep |$também captura e imprime todas as linhas que terminam, mas como $ é um caractere oculto, ele não pode ser destacado.

Atualizar:

Se você deseja imprimir toda a saída, mas também retornar o código de saída , se a correspondência foi encontrada ou não, você pode usar o comando perl:

cat testfile | \
perl -pe 'BEGIN {$status=1} END {exit $status} $status=0 if /hello/;'

Se você preferir sed - Veja um exemplo de como destacar todas as correspondências + retornar o código de saída se nenhuma correspondência for encontrada: https://askubuntu.com/a/1200851/670392

Noam Manos
fonte
2

Este funciona com o GNU grep e com o grep no FreeBSD:

grep --color=always 'hello\|$'

Corresponde ao texto "olá" ou ( \|) a sequência nula não imprimível no final de cada linha ( $). É por isso que cada linha é impressa, mas apenas "olá" é destacado.

Provavelmente, você já --color=autoconfigurou em seu shell. Então você provavelmente não precisa especificar --color=always:

grep 'hello\|$'

Você também pode usar uma versão mais simples usando egrep(com expressões regulares estendidas), onde |a expressão "ou" não precisa ser escapada:

egrep 'hello|$'
Marián Černý
fonte
Isso não responde como exibir todas as linhas de entrada.
Chris Page
@ ChrisPage Eu diria que sim: é por isso que cada linha é impressa, mas apenas "olá" é destacado.
Marián Černý
0

Adicionando à resposta superior acima. A função de destaque {} mencionada nos comentários só funciona quando os dados são canalizados para ela. O alias a seguir, embora não seja perfeito, é mais útil:

alias greph="grep --color=always -e^ -e"

Isso funciona com comandos como:

greph foo bar.txt

cat bar.txt | greph foo
rpmohn
fonte