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