Vous cherchez quelque chose comme ça ? Vous avez des idées ?
cmd | prepend "[ERRORS] "
[ERROR] line1 text
[ERROR] line2 text
[ERROR] line3 text
... etc
Vous cherchez quelque chose comme ça ? Vous avez des idées ?
cmd | prepend "[ERRORS] "
[ERROR] line1 text
[ERROR] line2 text
[ERROR] line3 text
... etc
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] "
J'ai créé un Dépôt GitHub pour faire quelques tests de vitesse.
Le résultat est :
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.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.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,'
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.