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

13

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

Como prefixo 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 pude obter:

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
Michael Durrant
fonte
9
Usando BEGIN e END ...
jasonwryan

Respostas:

18

Isso funciona, conforme indicado por jasonwryan :

awk 'BEGIN{print "START"}; {print}; END{print "END"}'
Michael Durrant
fonte
11

Isso pode ser feito sedcom

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

1imeios i NSERT antes linha 1; $asignifica um pender após a última linha. A $'…'sintaxe é específica do bash. Em outras conchas, você deve conseguir fazer isso com:

sed -e '1i \ Enter
START' -e '$ a \ Enter
END'Enter
Scott
fonte
8

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

Se tudo o que você precisa fazer é adicionar um cabeçalho e um rodapé, basta usar echoe 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
Gilles 'SO- parar de ser mau'
fonte