Comment ajouter un en-tête et / ou un pied de page à un flux sed ou awk?

13

J'ai un tas de sortie passant par sed et awk.

Comment puis-je préfixer la sortie avec START et suffixer la réponse avec END?

Par exemple, si j'ai

All this code
on all these lines
and all these

Comment pourrais-je obtenir:

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

?

Ma tentative était:

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

mais j'ai

...
START
    All this code
END
START
    on all these lines
END
START
    and all these
END
Michael Durrant
la source
9
Utilisation de BEGIN et END ...
jasonwryan

Réponses:

18

Cela fonctionne, comme indiqué par jasonwryan :

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

Cela peut être fait sedavec

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

1isignifie i nsert avant la ligne 1; $asignifie un ppend après la dernière ligne. La $'…'syntaxe est spécifique à bash. Dans d'autres coquilles, vous devriez pouvoir le faire avec:

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

Si vous utilisez déjà sed, vous pouvez utiliser 1pour faire correspondre la première ligne et $pour faire correspondre la dernière ligne (voir la réponse de Scott ). Si vous utilisez déjà awk, vous pouvez utiliser un BEGINbloc pour exécuter le code avant la première ligne et un ENDbloc pour exécuter le code après la dernière ligne (voir la réponse de Michael Durrant ).

Si tout ce que vous avez à faire est d'ajouter un en-tête et un pied de page, utilisez simplement echoet cat.

echo START
cat
echo END

Dans un pipeline, pour exécuter plusieurs commandes, utilisez { … }pour indiquer à l'analyseur qu'il s'agit d'une seule commande composée.

content-generator |
{ echo START; cat; echo END; } |
postprocessor
Gilles 'SO- arrête d'être méchant'
la source