Exibir todas as saídas, mas destacar as correspondências de pesquisa

Exibir todas as saídas, mas destacar as correspondências de pesquisa

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 de teste

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 enquadra. Posso usar -Ae -Bpara exibir 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 da pesquisa como o grep faria? então minha saída seria

hello #highlighted
there
my
friends

Responder1

Para usar um GREP colorido para destacar apenas os padrões correspondentes, mas não alterar a saída de outra forma:

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 quaisquer padrões seguintes) 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, portanto não compete/interfere na legibilidade do texto destacado.

Responder2

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

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

ou mais curto

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

Responder3

Este funciona com GNU grep e também com grep no FreeBSD:

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

Corresponde ao texto "hello" ou ( \|) à string 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|$'

Veja também uma pergunta semelhante no StackOverflow:Grep colorido – visualizando o arquivo inteiro com correspondências destacadas

Responder4

Aqui está uma solução usando ripgrep, um substituto moderno, mais fácil de usar (IMO) e muito mais rápido para grep:

cat my-file | rg --passthru '<REGEX>'

Você também pode personalizar facilmente a "cor do marcador":

# dark red foreground with light yellow background:
cat my-file | rg --passthru --colors match:fg:124 --colors match:bg:229 '<REGEX>'

Ver man rg(versão on-line).


Para uso diário, criei um alias de shell:

# in .bashrc
alias hl='rg --passthru --colors match:fg:124 --colors match:bg:229'

Agora é tão simples quanto cat my-file | hl '<REGEX>'.

informação relacionada