De acordo com o manual do awk, BEGIN e END não são usados para corresponder à entrada, mas para fornecer informações de inicialização e limpeza ao script do awk. Aqui está o exemplo dado:
ls -l | \
awk 'BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }'
Files found:
amd.conf
antivir.conf
xcdroast.conf
xinetd.conf
Primeiro, isso imprime uma string para saída. Em seguida, verifica a entrada para uma correspondência de padrão, onde a entrada começa com a ou x seguido por qualquer caractere uma ou várias vezes seguido pelo .conf. Para qualquer correspondência, a 9ª coluna é impressa.
O fato de sermos forçados a usar começa aqui, isso significa que o awk pode usar apenas no máximo uma função de impressão que contém BEGIN ou END? Caso contrário, por que não podemos simplesmente usar a função de impressão no início sem a palavra-chave BEGIN? Parece que o INÍCIO é supérfluo.
Respostas:
O
BEGIN
não é supérfluo. Se você não especificarBEGIN
, oprint
seria executado para cada linha de entrada.Citando o manual :
fonte
awk
processa cada linha de entrada para as expressões fornecidas no corpo que não sejamBEGIN
eEND
blocos. No caso deBEGIN
eEND
blocos,awk
processará as instruções apenas uma vez, antes do início do processamento da entrada e após o processamento da entrada, respectivamente. Sem oBEGIN
bloco, além de não ser possível imprimir informações únicas, como cabeçalhos, não seria possível inicializar com eficiência algumas das variáveis exigidas pelo corpo. Além disso, para sua informação, umawk
programa pode ter múltiplosBEGIN
eEND
blocos.fonte
awk
executa todos os blocos apenas quando o padrão antes de corresponder. O padrão vazio (apenas bloco) corresponde a todas as linhas.BEGIN
eEND
são padrões especiais que correspondem ao início e ao final do arquivo (análogo ao significado de^
e$
na direção horizontal).Se você deseja que algo seja executado antes de ler o arquivo, use
BEGIN
. Por exemplo, inicialização de contadores ou algo assim.END
poderia então coletar os resultados.fonte
No exemplo dado, que considero simplificado para maior clareza pedagógica, você está certo de que é supérfluo. Você pode obter os mesmos resultados sem usar
BEGIN
.produziria os mesmos resultados, já que a instrução print é restrita apenas à primeira linha de entrada.
Dito isto, os blocos
BEGIN
eEND
são ferramentas incrivelmente poderosas. Como outras soluções mencionaram, você pode usar oBEGIN
bloco para inicializar variáveis ou outras rotinas que precisam ser executadas apenas uma vez, mas também podem ser usadas para executar comandos do Awk quando não houver arquivos para processar. Um exemplo simples:Você pode ver um exemplo mais sério de programação no Awk sem processar nenhuma entrada aqui .
Da mesma forma, o
END
bloco é extremamente útil para realizar cálculos e resumir todas as entradas. Isso não pode ser feito (normalmente) sem a primeira leitura de todos os dados. Um exemplo simples de resumo da entrada pode ser encontrado aquifonte