J'ai un code GWAK comme celui-ci.
hello hello hello hello hello hello hello hello hello hello howareyou howareyou howareyou howareyou howareyou well well well well well well well well well well well hello 0 hello 1 hello 2 hello 3 hello 4 hello 0 hello 1 hello 2 hello 3 hello 4 howareyou 0 howareyou 1 howareyou 2 howareyou 3 howareyou 4 well 0 well 1 well 2 well 3 well 4 well 0 well 1 well 2 well 3 well 4
4 Réponses :
Je ne suis pas sûr de ce que vous voulez dire, si je comprends ... EM> P> Si vous souhaitez rediriger stdout code> à
file_out code>, redirect
starr code> à
file_err code>, vous pouvez le faire ... p>
Désolé si vous ne comprenez pas, je vais mieux expliquer. Oui, je veux les rediriger à tous les deux dans un fichier, mais le stdout doit être redirigé avant Stderr. Donc, dans le fichier de sortie, j'aurai d'abord les mots sans numéro, puis ceux avec nombre.
- Donc, cela n'est pas possible en une étape, vous devez ajouter une certaine logique pour contrôler le texte. Supposons que votre nom de fichier soit TMP code>. 1. Vous devez créer un fichier temporaire. 2. Rediriger SterderR sur ce fichier temporaire 3. Une fois la commande terminée, copiez et appendez le STDERR dans ce fichier temporaire dans votre fichier
TMP code>. 4. Supprimer ce fichier temporaire - Si vous souhaitez l'utiliser plusieurs fois, vous devez ajouter une autre étape (ajouter une étape entre 1-2 ci-dessus): Couper les lignes terminées par le nombre que dans
TMP code> dans le fichier temporaire. b>
D'accord, j'ai donc besoin de créer deux fichiers pour le faire.
Il n'y a pas de bon moyen * de raconter AWK ou de la coquille qu'il doit tamponner STDERR jusqu'à ce que l'outil se termine à exécuter. Gardez-le simple et faites simplement ceci:
awk -f script.awk file > out 2>&1
Le problème que vous rencontrez est due à la mise en mémoire tampon des flux Un des Hacks laids que vous pouvez appliquer est l'utilisation de stdout code> et
starr code>. Les deux flux ont des paramètres de mémoire tampon par défaut différents. Tandis que
stdout code> est tamponné à la ligne lorsque vous écrivez sur un terminal, il est très bien tamponné lorsqu'il écrit à un flux / tuyau / fichier. Le flux
stardr code> d'autre part est
starr code> et seulement la sortie de
stdout code> dans votre fichier
TMP code>. Sachez cependant que la sortie sera entrelée lorsque vous produirez plus de lignes comme tout d'un coup, le tampon de
stdout code> sera plein et écrit dans le fichier, en suivant une sortie de
starr code> jusqu'à ce que la mémoire tampon suivante de
stdout code> est pleine. Le problème est bien expliqué dans la page suivante:
STDBUF code> pour modifier la mise en mémoire tampon des données de données de
awk code>: p>
hello
hello 1
hello
hello 2
...
Comme alternative à l'utilisation de stdbuf code>, un appel à
fflush () code> à la fin de chaque paire d'impressions dans AWK peut forcer toute la sortie à être entrelacée au fur et à mesure de son apparition. . Notez que si vous utilisez
imprimer | "CAT> & 2" CODE> (Portable à TOUS AWKS) Pour imprimer sur STDRERR au lieu de
Imprimer> "/ dev / stardr" code> (fonctionne uniquement dans certaines hornières) alors vous aurez également besoin de
Fermer ("CAT> & 2") CODE> Après chaque impression pour éviter
CAT CODE> Aussi faire tampon.
Lit binaire vieux, mais si quelqu'un en a encore besoin:
echo "some stuff" | awk '{ for (i=0;i<5;i++){ print $0; # print i on stderr system(">&2 echo " i); } }'
Vous mentionnez dans votre question que le fichier
TMP code> contient le premier
starr code> dans votre sortie, le fichier semble avoir d'abord
stdout code>. Pourriez-vous s'il vous plaît élaborer ce que vous voulez dire ici?