Como adicionar um cabeçalho e / ou rodapé a um stream sed ou awk?

10

Eu tenho um monte de saída passando por sed e awk.

Como posso prefixar a saída com START e sufixo a resposta com END?

Por exemplo, se eu tiver

All this code
on all these lines
and all these

Como eu poderia conseguir:

START
All this code
on all these lines
and all these
END

?

Minha tentativa foi:

awk '{print "START";print;print "END"}'

mas eu tenho

...
START
    All this code
END
START
    on all these lines
END
START
    and all these
END
    
por Michael Durrant 29.08.2015 / 04:25

3 respostas

15

Isso funciona, conforme indicado por jasonwryan :

awk 'BEGIN{print "START"}; {print}; END{print "END"}'
    
por 29.08.2015 / 05:05
10

Isso pode ser feito em sed com

sed -e $'1i\\nSTART' -e $'$a\\nEND'

1i significa i nsert antes da linha 1; $a significa a ppend após a última linha. A sintaxe $'…' é específica do bash. Em outros shells, você deve conseguir fazer isso com:

sed -e '1i\Enter
START' -e '$a\Enter
END'Enter
    
por 29.08.2015 / 07:59
8

Se você já estiver usando sed, poderá usar 1 para corresponder à primeira linha e $ para corresponder à última linha (consulte resposta de Scott ). Se você já estiver usando o awk, poderá usar um bloco BEGIN para executar o código antes da primeira linha e um bloco END para executar o código após a última linha (consulte Resposta de Michael Durrant ).

Se tudo o que você precisa fazer é adicionar um cabeçalho e um rodapé, use apenas echo e cat .

echo START
cat
echo END

Em um pipeline, para executar vários comandos, use { … } para informar ao analisador que eles são um único comando composto.

content-generator |
{ echo START; cat; echo END; } |
postprocessor
    
por 29.08.2015 / 19:30