La redirection des printf pour fichier awk
J'ai un simple script bash.
Dont le but est de surveiller les accès http journal de fichier (test.journal) et la sortie vers un fichier (.journal) la mise à jour des taux de succès:
stdbuf -o0 tail -f test.log | awk -F'[ "]+' '{
ipcount[$1]++;
print "test" > "out.log"; #Truncate out.log
for (i in ipcount) {
printf "%15s - %d\n", i, ipcount[i] >> "out.log";
printf "%15s - %d\n", i, ipcount[i] }
}'
La principale logique fonctionne. mon seul problème, c'est de la redirection vers ".journal" qui ne semble pas fonctionner.
Le dernier printf sorties le résultat attendu à la sortie standard.
Mais les deux autres printf ne pas afficher quoi que ce soit".journal", et je ne peux pas comprendre pourquoi.
.le journal a tous les droits (777)
Que faire si vous supprimez les guillemets autour de fichier de sortie, par exemple, juste
C'est un
Est-il une raison de ne pas seulement rediriger la sortie de AWK dans un fichier?
lorsque vous essayez sans les guillemets, j'obtiens une erreur de syntaxe sur le"."(dot) qui sépare le nom de fichier et l'extension.
notez qu'avant la boucle, je veux tronquer le fichier, et ajouter à l'intérieur de la boucle.
printf "text" >> output.log
?C'est un
awk
question, pas une bash
question.Est-il une raison de ne pas seulement rediriger la sortie de AWK dans un fichier?
lorsque vous essayez sans les guillemets, j'obtiens une erreur de syntaxe sur le"."(dot) qui sépare le nom de fichier et l'extension.
notez qu'avant la boucle, je veux tronquer le fichier, et ajouter à l'intérieur de la boucle.
OriginalL'auteur Yan4321 | 2015-08-06
Vous devez vous connecter pour publier un commentaire.
Cela devrait fonctionner pour vous:
(Note: j'ai déplacé le fichier de sortie définition de la ligne de commande pour l'espérons, de réduire la répétition.)
Votre version d'origine a une issue fatale:
print "" > "out.log"
seulement tronqueout.log
la première temps elle est appelée. Tous les appels ultérieurs, il sera tout simplement s'y ajouter, car il est déjà ouvert. Comme une question secondaire, awk aime à le tampon de sortie, de sorte que les contenus ne seront vidées par intermittence.Pour résoudre ce problème, nous avons besoin de
close
le fichier après chaque itération. Cette force des bouffées de chaleur à la sortie deout.log
et les forces de l'>
redirection de re-tronquer le fichier sur la prochaine itération. Si vous n'avez pas besoin de tronquer chaque itération, une simplefflush(out_file)
suffirait.Pour illustrer la question plus clairement...
Il en résulte une
output.txt
qui a plusieurs lignes, car il est tronqué juste une fois (la première itération):Il en résulte une
output.txt
avec un unique ligne de sortie parce qu'elle est tronquée à plusieurs reprises:Ah, l'autre problème serait alors de savoir que awk aime à le tampon de sortie (si la sortie est d'aller dans un terminal). Pour corriger cela, vous auriez besoin de
fflush
le fichier ou un flux.OriginalL'auteur Mr. Llama