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


Eu 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 fazer o grep salvar em algum tipo de linguagem de marcação? Se não for possível, existe outra ferramenta que possa realizar essa tarefa?

Eu estou tentando fazer a palavra-chave de busca se destacar no arquivo de saída, exatamente como acontece no terminal.


34
2017-07-25 09:11


origem




Respostas:


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

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

    sudo apt-get install aha
    
  • em seguida, salve seu grep (ou ls) saída 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
    
  • então execute este tipo de comando:

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

enter image description here


39
2017-07-25 09:36



AHA !!, aha é uma ferramenta realmente maravilhosa, exatamente o que eu estava procurando, obrigado !! - Mhd.Tahawi
@ Mhd.Tahawi: Eu atualizei minha resposta para que você possa manter as cores do código (perl no seu caso), mas pygmentize trabalha com muitos outros. - Sylvain Pineau
Isso é incrível, obrigado! - t1gor


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. Grep parece não querer imprimi-los quando você 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 essa cor".

cat output.txt

No entanto, se você abri-lo em um editor como vim, você terá alguns personagens 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 certa quando eu imprimo usando cat mas quando abro em vim eu recebo

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

Então, se você está querendo usar um editor, isso provavelmente não é o que você quer.


9
2017-07-25 15:25



Correto !!, eu estava recebendo esses símbolos estranhos entre eles e não entendi quais são esses. - Mhd.Tahawi
Eu realmente gosto de quão simples / eficaz sua resposta é. apenas cat a saída :). isso é ótimo para curto prazo (apenas bom o suficiente para mim agora). - Trevor Boyd Smith
Detalhe: é o terminal (emulador), não bash, que interpreta a cor seqüências de escape (também conhecido como caracteres estranhos) - masterxilo


Se eu entendi corretamente, você deseja salvar uma saída de terminal em um arquivo de texto, certo? Mas você quer que 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 do grep em um arquivo de texto, exatamente porque é um arquivo de texto, ele 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, consistindo em realizar o seu editor de texto que tipo de arquivo está abrindo. Por exemplo, digamos que sua saída grep tenha alguns componentes bash, então os destaques bash funcionam para você (a propósito, essas são as cores que você vê em uma saída colorida no terminal). Então o truque é salvar a saída de texto em um arquivo com a extensão apropriada. 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 código bash, e irá destacá-lo de acordo. Você não precisa colorir a saída, o programa fará isso para 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 a um ajuste melhor para o que você está fazendo (por exemplo,> output.xml,> output.html,> output.py ... etc). Boa sorte! :)

Destacando as algumas palavras no arquivo de saída

Então, se eu entendi, você quer destacar as palavras que você pesquisou. Novamente, isso não pode ser feito em um arquivo de texto simples apenas porque é um texto simples. No entanto, você pode adicionar algum formato a ele de uma maneira muito fácil, como usar alguma codificação html. Isto irá transformar a sua saída em um código html, e quando você abri-lo com um programa capaz de interpretar html (libreoffice writer, firefox, e 10000 etc) você verá algumas palavras highlited.

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

ls | grep keytext > output.html

E agora você quer destacar keytext na sua saída. Você pode usar sed para fazer isso, como:

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

E violà, agora o seu texto-chave é destacado em vermelho.


2
2017-07-25 09:23



boa idéia !!, mas eu não estou procurando destaque de sintaxe. Você sabe como grep cor a palavra-chave de pesquisa com outra cor, geralmente vermelho. Eu quero manter isso para que a palavra-chave destaque no arquivo de saída. - Mhd.Tahawi
ok, então você está ganhando algo com cor? como um código html? Se você vir a cor na entrada, ela precisa ser formatada e, portanto, codificada em algum lugar, como "fontcolor: red", certo? Se este for o caso, você pode precisar incluir o código de formatação em seu grep. :) - Rho
ok, com a edição na pergunta eu entendi. :) Que extensão de saída você está usando? - Rho
Eu estou usando um código perl, quando eu usei a extensão perl, eu tenho uma coloração de sintaxe completa, e estou ganhando um nome de variável, então ele não estava nem colorido. - Mhd.Tahawi