[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] Comparando "bash expansion" com "cut" e "awk"
From: |
Reinaldo Carvalho |
Subject: |
Re: [shell-script] Comparando "bash expansion" com "cut" e "awk" |
Date: |
Wed, 16 Aug 2006 11:51:55 -0300 |
Acredito que a melhor solução é com o IFS=: para ler vários dados do
/etc/passwd.
$ time awk -F: '{print $1}' /etc/passwd > /dev/null
real 0m0.006s
user 0m0.004s
sys 0m0.004s
$ time cut -f1 -d: /etc/passwd > /dev/null
real 0m0.003s
user 0m0.004s
sys 0m0.000s
No caso, geralmente se precisa pegar vários dados de cada linha e
separá-los em variáveis diferentes para executar uma determinada
tarefa, sendo necessário o laço (while), e nesse caso, as formas
acima, não são equivalente com as formas anteriores.
A forma mais rápida foi essa:
IFS=:
$ time while read usuario group ; do echo $usuario X $group ; done <
<(cut -f1,3 -d: /etc/passwd)
real 0m0.214s
user 0m0.092s
sys 0m0.056s
E claro, deve-se evitar ao máximo o uso de cut/awk para separar
variáveis dentro de um laço... Sem nenhuma dúvida, a melhor forma, é
ajustar o IFS a entrada de dados, para poder usar um mútiplo read com
o while, como o Júlio indicou.
É importante lembrar que caso seja necessário mudar o IFS dentro do
while, deve usar novamente IFS=: antes do final do while.
[]s
--
Reinaldo Carvalho
Debian Sarge 3.1 - Linux User: #238310
Prodepa - address@hidden