Salvando a saída de um grep em um arquivo com cores

36

Preciso salvar o resultado de um comando grep em um arquivo, mas também quero que o arquivo de saída seja formatado e mantenha as cores como no terminal.

Existe uma maneira de fazer isso? Talvez faça grep salvar em algum tipo de linguagem de marcação? Se não for possível, existe outra ferramenta que pode realizar essa tarefa?

Estou tentando destacar a palavra-chave de pesquisa no arquivo de saída, exatamente como no terminal.

Moha, o todo-poderoso camelo
fonte

Respostas:

43

Para manter a marcação, você precisa mais do que apenas um arquivo de texto. Eu usaria a saída HTML para manter as cores.

  • Instale aha, isto é, para "converte seqüências de escape ANSI de um terminal unix em código HTML "

    sudo apt-get install aha
  • salve sua saída grep(ou ls) assim:

    ls --color=always | aha --black --title 'ls-with-colors' > ls-with-colors.html

    opções:

    --black param to set background as black color
    --title param to set the title for HTML page

Destaque de sintaxe para extensão de arquivo via pygmentize

  • instalar pygmentize:

    sudo apt-get install python-pygments
  • em seguida, execute este tipo de comando:

    pygmentize file.pl | grep -i --color=always version | aha --black > ls-with-colors.html

insira a descrição da imagem aqui

Sylvain Pineau
fonte
11
AHA !! , aha é uma ferramenta realmente maravilhosa, exatamente o que eu estava procurando, obrigado !!
Moha o todo-poderoso camelo
2
@ Mhd.Tahawi: Atualizei minha resposta para que você possa manter as cores do código (perl no seu caso), mas pygmentizetrabalha com muitas outras.
22414 Sylvain Pineau
10

Dependendo do que você deseja fazer com o arquivo de saída, é possível adicionar cores a um arquivo de texto normal, porque as cores simplesmente vêm de alguns caracteres especiais. O Grep parece não querer imprimi-los quando você o redireciona para um arquivo, então você precisa forçá-lo a:

grep --color=always "stuff" input.txt > output.txt

Agora, quando você imprimir o arquivo no console, ele será impresso com as cores, porque o Bash interpreta esses caracteres como "use esta cor".

cat output.txt

No entanto, se você o abrir em um editor como esse vim, obterá alguns caracteres estranhos. Por exemplo, quando eu uso os comandos

echo "A sentence. A red sentence. Another sentence." \
  | grep --color=always "A red sentence" > output.txt

A saída parece correta quando eu a imprimo usando, catmas quando a abro, vimrecebo

A sentence. ^[[01;31m^[[KA red sentence^[[m^[[K. Another sentence.

Portanto, se você deseja usar um editor, provavelmente não é o que deseja.

MasterOfBinary
fonte
Correto !!, eu estava colocando esses símbolos estranhos no meio e não entendia o que eram.
Moha o onipotente camelo
Eu realmente gosto de quão simples / eficaz é a sua resposta. apenas cat a saída :). isso é ótimo a curto prazo (bom o suficiente para mim agora).
Trevor Boyd Smith
Detalhe: é o terminal (emulador), não o bash, que interpreta as seqüências de escape de cores (também conhecidas como caracteres estranhos).
Masterxilo #
2

Se entendi corretamente, você deseja salvar uma saída do terminal em um arquivo de texto, certo? Mas você quer que ele seja formatado com cores. Se for esse o caso, aqui estão minhas idéias:

Destacando a saída automaticamente

Como você provavelmente sabe, se você capturar uma saída grep em um arquivo de texto, exatamente porque é um arquivo de texto, não pode ser formatado. Então, tanto quanto eu sei, você não pode fazer isso de uma maneira fácil.

Apesar disso, existe uma solução simples, que consiste em realizar o seu editor de texto que tipo de arquivo está abrindo. Por exemplo, digamos que sua saída grep tenha alguns componentes do bash, então os destaques do bash funcionam para você (a propósito, essas são frequentemente as cores que você vê em uma saída colorida no terminal). Portanto, o truque é salvar a saída de texto em um arquivo com a extensão adequada. Em vez de fazer algo como:

ls | grep something > output

você pode ir para

ls | grep something > output.sh

O que fará com que o gedit (ou qualquer editor de texto decente) reconheça automaticamente que você está falando sobre o código bash e o realce de acordo. Você não precisa colorir a saída, o programa fará isso por você se reconhecer o tipo de código que está abrindo. Se você estiver trabalhando com outro tipo de formato, apenas adapte a extensão àquela que melhor se ajusta ao que você está usando (por exemplo,> output.xml,> output.html,> output.py ... etc). Boa sorte! :)

Destacando algumas palavras no arquivo de saída

Então, se eu entendi, você deseja destacar as palavras que procurou. Novamente, isso não pode ser feito em um arquivo de texto sem formatação apenas porque é um texto sem formatação. No entanto, você pode adicionar algum formato a ele de uma maneira muito fácil, como usar alguma codificação html. Isso transformará sua saída em um código html, e quando você a abrir com um programa capaz de interpretar html (escritor do libreoffice, firefox e 10000 etc), você verá algumas palavras destacadas.

Para fazer isso, digamos que este seja seu grep, exportado para html:

ls | grep keytext > output.html

E agora você deseja destacar o texto-chave em sua saída. Você pode usar o sed para fazer isso, como:

sed -i 's/keytext/<font color="red">keytext<\/font>/g' output.html

E violà, agora seu texto-chave está destacado em vermelho.

Rho
fonte
11
boa ideia !!, mas não estou procurando realce de sintaxe. você sabe como grep colore a palavra-chave de pesquisa com outra cor, geralmente vermelha. Quero manter isso para que a palavra-chave se destaque no arquivo de saída.
Moha o todo-poderoso camelo
ok, você está ganhando algo com cores? como um código html? Se você vir cor na entrada, ela deverá ser formatada e, portanto, codificada em algum lugar, como "fontcolor: red", certo? Se for esse o caso, pode ser necessário incluir o código de formatação no seu grep. :)
Rho
ok, com a edição na pergunta eu entendi. :) Qual extensão de saída você está usando?
Rho
Estou exibindo um código perl, quando usei a extensão perl, recebi uma coloração completa da sintaxe e exibi um nome de variável para que nem sequer fosse colorido.
Moha o todo-poderoso camelo