sexta-feira, 29 de agosto de 2008

Bash Script: Lendo linha a linha de um arquivo

Certo dia precisei fazer um script em bash que analisava um arquivo texto (na ocasião era o arquivo de log do vsftpd) e processava linha a linha. A terefa me parecia simples, bastava usar um for. Por isso fiz:

#!/bin/sh
LOG=’cat /var/log/vsftpd’
for LINHA in $LOG; do
echo $LINHA;
done


Infelizmente a solução acabou não sendo tão simples assim. Ao executar tal script eu acabava por receber cada palavra contida no arquivo em uma linha diferente.

Cheguei a fazer alguns testes tentando ler o arquivo de uma maneira diferente, e todos foram sem sucessos. Depois de coçar a cabeça um pouco mais eu finalmente encontrei a resposta, a mais simples possível: Inter Field Separator.

Inter Field Separator, ou IFS, é a variável padrão do sistema que define a divisão entre os campos de uma determinada string. Esse valor, que fica salvo na variável de mesmo nome, que é utilizado pelo for.

Por isso, tudo que precisei fazer para que meu script funcionasse foi alterar o valor de IFS de modo que o separador de campos do sistema deixasse de ser o espaço (padrão) e passasse a ser a quebra de linha. Dessa maneira, o meu script acabou ficando assim:

#!/bin/sh
IFS=´
´
lOG=’cat /var/log/vsftpd’
for LINHA in $LOG; do
echo $LINHA;
done