J'essaie de compter le nombre de lignes de sortie produites par un programme donné. Le problème est que l'exécution du programme prend beaucoup de temps et je souhaite afficher la sortie à l'utilisateur. Existe-t-il un moyen de compter le nombre de lignes de la dernière commande sortie?
Je pourrais le faire program | wc -l
mais cela ne montrerait pas la sortie à l'utilisateur. Donc, autant que je sache, je dois le faire program; program | wc -l
- mais le programme prend au moins une minute, et je ne veux donc pas le faire plus d'une fois, juste pour afficher un nombre de lignes en bas.
MODIFIER:
- Existe-t-il un moyen d'afficher la sortie au fur et à mesure (ligne par ligne), puis de renvoyer un compte à la fin?
bash
shell
debian
command-line
Libbux
la source
la source
STDOUT_WRITE_COUNT
) ou de la consigner dans un fichier / API à la fin du programme. WDYT?Réponses:
Vous pouvez utiliser
tee
pour diviser le flux de sortie en envoyant une copie àwc
l'autre et STDOUT comme d'habitude.La
>(cmd)
syntaxe is bash, qui signifie exécutercmd
et remplacer le>(cmd)
bit par le chemin d'accès (un canal nommé connecté à), le STDIN de ce programme.la source
>(cmd)
Cetteksh
syntaxe est également reconnue parzsh
etbash
et n'utilise que des canaux nommés sur des systèmes qui n'en ont pas/dev/fd/n
.bash
invention, car le libellé de votre réponse pouvait laisser croire.sed
et neawk
sont qu'un. Maistee
etwc
sont tous deux extrêmement petits (beaucoup plus petits quesed
etawk
).sed
andawk
. (Jedd
d 100mb de/dev/urandom
dans un fichier et ensuite couru ce fichier à travers chaque méthode plusieurs fois)Une option consiste à utiliser awk, qui peut effectuer le comptage et l’impression sur la sortie standard.
In
awk
, NR est le numéro de ligne actuel. Vous pouvez accomplir la même chose avec perl:Ou
sed
:la source
Vous pouvez cloner stdout sur stderr.
De cette façon,
program
la sortie standard de stdouttee
doit être écrite sur stderr, qui est imprimée sur la console.tee
écrit également les données qui lui sont transmises sur sa stdout, qui est dirigée verswc
.la source
mon option préférée:
la source
la source
C'est peut-être tard. Mais je voudrais juste répondre à votre question suivante sur la façon d’attraper le nombre compté dans une variable.
C'est ce que tu veux
YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l)
.Nous profitons de la
tee
génération de deux flux ici et dirigeons l'un vers/dev/stderr
, ce qui apparaîtrait sur votre écran, et l'autrewc -l
, qui indiquerait le nombre de lignes.la source