
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 -A
e -B
para 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 -z
ao 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=auto
configurou 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>'
.