O desempenho é complicado. A única maneira de ter certeza é fazer benchmark em um sistema real com uma carga real.
Piping vários utilitários definitivamente tem um custo. Comparado com as operações de string, esse custo é muito alto. No entanto, se a quantidade de dados for grande o suficiente, uma solução de canal pode ser mais rápida, pois pode permitir que ferramentas especializadas realizem seu trabalho mais rapidamente e permitir processamento de dados paralelo (se a máquina for multicore e houver processamento útil suficiente) ser feito em paralelo para que valha a pena). Mas se a quantidade de dados é pequena, o custo para iniciar os programas é predominante. O ponto em que o fator dominante muda é muito dependente do sistema e do cenário de uso.
De um modo geral, quanto mais versátil for uma ferramenta, mais lenta ela é. Portanto, se você tiver uma tarefa que
grep
ou
head
possa fazer, geralmente
sed
também poderá fazê-lo, mas não tão rápido; e
awk
será ainda mais lento. Esta é apenas uma regra geral; Se você procurar, poderá encontrar implementações específicas e cargas de trabalho específicas, nas quais o awk ou o sed superam outras ferramentas. O volume de dados tem que ser suficientemente alto para que a diferença seja observável.
Para pequenos volumes de dados, o número de startups de processos é o custo dominante. De um modo geral, quanto mais versátil for uma ferramenta, mais lenta será a inicialização. O lançamento de várias ferramentas tem um custo de desempenho em si, porque significa que mais código precisa ser carregado na memória. No entanto, se você usar o BusyBox, onde todas as ferramentas estão agrupadas em um único executável, esse aspecto será minimizado.
A partir de
cat file | grep ^field | head -n1 | sed 's/:/ /' | awk '{print $1}'
a invocação de cat
é inútil e não pode ajudar no desempenho. Usar grep ^field | head -n1 | sed 's/:/ /'
pode ter uma pequena vantagem se o volume de dados for muito grande, mas na maioria dos cenários eu esperaria
<file sed -n '/^field/ { s/:/ /p; q; }'
ser mais rápido porque evita ter que esperar por vários processos.
Quanto à invocação do awk, simplesmente não é necessário aqui. Se não houver dois pontos iniciais, o comando é equivalente a
<file sed -n '/^field/ { s/:.*//p; q; }'
ou, se grep
provar ter uma vantagem,
<file grep '^field' | sed -e 's/:.*//' -e 'q'
E se houver dois pontos iniciais, apenas adicione s/^::*//
no início do comando sed
.