Filtrando a saída colorida do grep

6

Estou no OSX, mas suspeito que isso não faz grande diferença para esta pergunta. No meu .bash_profile, fiz um alias greppara obter saídas coloridas por padrão:

alias grep='grep --color=always'

Normalmente, procuro conteúdo em arquivos nos meus repositórios de maneiras semelhantes a:

grep --include=*.cpp -Ern . -e "(foo|bar)"

mas muitas vezes eu quero refinar ainda mais os resultados, normalmente com a palavra grep -v "colorbar".

O problema é que o segundo grepcomando é executado na saída colorida e não parece capaz de corresponder aos padrões de exclusão por causa disso.

Obviamente, eu poderia executar a primeira pesquisa sem cores e tudo funcionaria bem, mas eu preferiria mantê-las se houver uma maneira de contornar isso?

Sheljohn
fonte
11
parece uma duplicata de unix.stackexchange.com/questions/111899/… . pode também dar uma olhada em commandlinefu.com/commands/view/3584/...
Dani_l
11
Se você nem sempre quer cores, por que está configurando para fazer isso? Você deseja que as cores sejam preservadas através do greps? Talvez você possa apenas criar um alias grep "sem cor" para esses casos?
21416 Eric
@EricRenouf Como adicionado à edição, eu preferiria que as correspondências originais ainda pudessem ser coloridas após o filtro, obviamente.
precisa saber é o seguinte
@Dani_l De fato, isso parece funcionar: grep --include=*.cpp -Ern . -e "(foo|bar)" | sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | grep -v "colorbar" e preserva as cores também! :) Devo fechar o OP então?
Sheljohn
2
@ Sh3ljohn, estou curioso: como a cor é preservada? O grep não falhará se as cores ainda estiverem presentes?
Prem

Respostas:

2

A resposta simples e óbvia é:

  1. Altere seu alias para ter em --color=autovez dealways
  2. Canalize seus comandos grep para o conteúdo do seu coração
  3. Use um comando grep extra no final do pipeline apenas para colorir os resultados que você deseja colorir, por exemplo:

    grep --include=*.cpp -Ern . -e "(foo|bar)" | grep -v colorbar | grep -E -e "(foo|bar)"
    

No entanto, isso não colorirá seus nomes de arquivos e números de arquivos tão bem.

Outra solução possível é muito mais complicada, mas ainda vale a pena mencionar: você pode usar pcregrepum único regex muito mais sofisticado para lidar com toda a sua filtragem em um regex.

Curinga
fonte
11
Sim, a correspondência sem cores, o filtro e a correspondência com cores funcionará. Parece um pouco hacky, não é?
amigos estão dizendo sobre sheljohn
11
@ Sh3ljohn faz de fato. Você pode considerar executar o -vteste primeiro , portanto, seria necessário apenas dois grepcomandos no total. Há outra consideração sobre os grepcomandos de encadeamento que você pode não considerar: os nomes dos arquivos se tornam parte do texto examinado pelos comandos grep posteriores. Possíveis erros lógicos.
Curinga
-1

remova o arquivo /etc/profile.d/colorgrep* Com a versão mais recente do linux, eles estão forçando um apelido para greg / egrep e fgreg, remova esses arquivos e volte ao normal.

Keith
fonte
Isso não interromperia o uso de cores em todas as grepchamadas? Eu também recomendaria não excluir arquivos em /etcque um gerenciador de pacotes tenha instalado.
Kusalananda