80 votes

Commande pour ajouter une chaîne de caractères à chaque ligne ?

Vous cherchez quelque chose comme ça ? Vous avez des idées ?

cmd | prepend "[ERRORS] "

[ERROR] line1 text
[ERROR] line2 text
[ERROR] line3 text
... etc

82voto

Dan Points 493

Essayez ça :

cmd | awk '{print "[ERROR] " $0}'

Cheers

65voto

mreggen Points 2940
cmd | while read line; do echo "[ERROR] $line"; done

a l'avantage de n'utiliser que des buildins bash, ce qui réduit le nombre de processus créés/détruits. devrait être un peu plus rapide que awk ou sed.

@tzrik fait remarquer que cela pourrait aussi faire une belle fonction bash. En la définissant comme :

function prepend() { while read line; do echo "${1}${line}"; done; }

permettrait de l'utiliser comme :

cmd | prepend "[ERROR] "

36voto

Nano Taboada Points 1944

Avec tout le crédit dû à @grawity, je soumets son commentaire comme réponse, car il me semble être la meilleure réponse ici.

sed 's/^/[ERROR] /' cmd

15voto

willlma Points 243

J'ai créé un Dépôt GitHub pour faire quelques tests de vitesse.

Le résultat est :

  • Dans le cas général, awk est le plus rapide. sed est un peu plus lent et perl n'est pas beaucoup plus lent que sed . Apparemment, tous ces langages sont hautement optimisés pour le traitement des textes.
  • Dans des situations très particulières, où les bifurcations dominent, l'exécution de votre script en tant que compilé. ksh script ( shcomp ) permet de gagner encore plus de temps de traitement. En revanche, bash est très lente par rapport à la version compilée ksh scripts.
  • Création d'un binaire lié statiquement pour battre awk semble ne pas en valoir la peine.

En revanche python est mortellement lent, mais je n'ai pas testé de cas compilé, car ce n'est généralement pas ce que vous feriez dans un tel cas de script.

Les variantes suivantes sont testées :

while read line; do echo "[TEST] $line"; done
while read -r line; do echo "[TEST] $line"; done
while read -r line; do echo "[TEST]" $line; done
while read -r line; do echo "[TEST]" "$line"; done
sed 's/^/[TEST] /'
awk '{ print "[TEST] " $0 }'
awk -vT="[TEST] " '{ print T $0 }'
awk -vT="[TEST]" '{ print T " " $0 }'
awk -vT="[TEST]" 'BEGIN { T=T " "; } { print T $0 }'
T="[TEST] " awk '{ print ENVIRON["T"] $0 }'
T="[TEST]" awk '{ print ENVIRON["T"] " " $0 }'
T="[TEST]" awk 'BEGIN { T=ENVIRON["T"] " " } { print T $0 }'
perl -ne 'print "[TEST] $_"'

Deux variantes binaires d'un de mes outils (il n'est pas optimisé pour la vitesse, cependant) :

./unbuffered.dynamic -cp'[TEST] ' -q ''
./unbuffered.static -cp'[TEST] ' -q ''

Python mis en mémoire tampon :

python -uSc 'import sys
for line in sys.stdin: print "[TEST]",line,'

Et Python non tamponné :

python -uSc 'import sys
while 1:
 line = sys.stdin.readline()
 if not line: break
 print "[TEST]",line,'

6voto

jason saldo Points 5036
cmd | sed 's/.*/[ERROR] &/'

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X