Grep não Funciona em Arquivo TXT

Estava enfrentando um problema ao tentar usar o grep para filtrar um arquivo .txt contendo logs do SQL Server 2008.

Aparentemente tudo estava correto com o arquivo, eu tinha as devidas permissões e conseguia visualizar seu conteúdo usando cat normalmente, porém ao tentar usar o grep buscando por uma palavra que eu tinha certeza que o arquivo continha, nada era retornado no terminal.



O problema era o encoding do arquivo que aparentemente não estava sendo reconhecido corretamente pelo meu terminal (gnome-terminal)

A solução foi converter o arquivo para utf-8 onde eu consegui filtrar o arquivo usando grep sem problemas.

Descobrindo o Encoding do Arquivo

Antes de converter o arquivo, devemos descobrir qual o atual encoding do mesmo. Para isso utilize o comando file que conforme o manual (man file) :
File - Determina o tipo do arquivo 

Ao executar o comando passando o arquivo como parâmetro: 


file sql_log.txt
sql_log.txt: Little-endian UTF-16 Unicode text, with very long lines, with CRLF line terminators


O output nos mostra que o encoding do arquivo é Little-endian UTF-16, mas essa informação não irá nos ajudar muito na hora na conversão, pois precisaremos exatamente do mime type do encoding.
Podemos obtê-lo passando o parâmetro -i para o comando file:

file -i sql_log.txt
sql_log.txt: text/plain; charset=utf-16le

Agora o output nos mostra exatamente o que queremos utf-16le, essa é a informação que usaremos para a conversão, caso o encoding do seu arquivo seja diferente anote ele e siga para o próximo passo.

Convertendo o Arquivo

Para converter o arquivo usaremos o comando iconv que segundo seu manual:
iconv - Converte o encoding de determinados arquivos de um encoding para outro

 Então com o tipo do encoding do arquivo que queremos converter encontrado, passamos essa informação com o parâmetro -f , seguido do parâmetro -t informando o tipo do encoding que desejamos. E por último passamos o parâmetro -o para informar qual será o novo arquivo com o novo encoding.


iconv -f utf-16le -t utf-8 sql_log.txt -o output.txt

Se o comando não apresentou nenhuma informação, o arquivo foi convertido e o novo arquivo output.txt foi criado.
Verifique que o novo arquivo estará com o encoding utf-8


file -i output.txt
output.txt: text/plain; charset=utf-8

Agora é possível utilizar o grep para filtrar o conteúdo do arquivo em utf-8.

Para maiores informações veja o manual dos comandos:

man file
man iconv 

Postado em por Rafael Santos.

Deixe um comentário