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

36

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?

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

    
por Mhd.Tahawi 25.07.2014 / 11:11

3 respostas

41

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.

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

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

    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

  • instale pygmentize :

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

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

    
por Sylvain Pineau 25.07.2014 / 11:36
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. 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ê 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 certa quando eu imprimo usando cat , mas quando eu 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, provavelmente não é o que você quer.

    
por MasterOfBinary 25.07.2014 / 17:25
2

Se eu entendi corretamente, você quer 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 as minhas ideias:

Realce 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 escolher

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 está fazendo (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ê 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 seja 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 seu texto-chave é destacado em vermelho.

    
por Rho 25.07.2014 / 11:23