É possível ler informações de um arquivo através do
bash de um modo muito semelhante ao que o comando
cut e a linguagem
AWK proporcionam.
De modo que, pode-se pensar todo o problema em bash, evitando alguma complicação na mistura das duas linguagens.
Veja o fragmento do arquivo
/etc/group:
root:x:0:
daemon:x:1:
bin:x:2:
tty:x:5:
disk:x:6:
uucp:x:10:
man:x:12:
proxy:x:13:
Ele possui o caractere ":" como separador de campos e possui quatro campos em cada registro (linha).
Usa-se o comando
read coma opção "-a" em um laço while para a leitura. Além disso, deve-se mudar o default de separação de campos nesse tipo de leitura. A variável que determina isso, é a variável IFS (Internal Field Separator).
Dependendo da situação, pode ser bom guardar o valor da IFS para restaurá-lo posteriormente, de modo a não ter nenhuma surpresa.
Para a entrada dos dados do arquivo
/etc/group, há dois modos: um no início e outro no fim:
- 1º ao INÍCIO: cat /etc/group | while read -a i; do ...
- 2º ao FIM: ... done < /etc/group;
A desvantagem do primeiro, é o fato de que o "pipe" executa o "while" em uma subshell e qualquer variável usada antes e fora desse "pipe", deve ter sido previamente exportada (comando
export).
A opção "-a" aplica um
split (quebra, separação, fragmentação) da linha lida naquela etapa do laço, de modo que a variável "i" é, na verdade, um array. O primeiro item desse array é ${i[0]}. Depois segue ${i[1]}, ${i[2]} ... Os campos são definidos pela variável IFS.
Concluindo com estes fragmentos de códigos:
1.
OLD_IFS=$IFS
IFS=:
while read -a i; do
echo -e "group:\t${i[0]}";
echo -e "passwd:\t${i[1]}";
echo -e "gid:\t${i[2]}";
echo -e "users:\t${i[3]}";
done < /etc/group
IFS=$OLD_IFS
2.
OLD_IFS=$IFS
IFS=:
cat /etc/group | while read -a i; do
echo -e "group:\t${i[0]}";
echo -e "passwd:\t${i[1]}";
echo -e "gid:\t${i[2]}";
echo -e "users:\t${i[3]}";
done < /etc/group
IFS=$OLD_IFS
Nenhum coment�rio foi encontrado.