Réponses:
Vous pouvez utiliser wc
pour cela:
grep pattern file.txt | wc -c
comptera le nombre d'octets dans la sortie. Vous pouvez post-traiter cela pour convertir de grandes valeurs au format «lisible par l'homme» .
Vous pouvez également utiliser pv
pour obtenir ces informations dans un tuyau:
grep pattern file.txt | pv -b > output.txt
(ceci affiche le nombre d'octets traités, dans un format lisible par l'homme).
| wc -c | sed 's/$/\/1024\/1024/' | bc
. Cela s'ajoute /1024/1024
à la sortie et exécute une calculatrice sur la chaîne résultante.
Vous pouvez utiliser l'outil pipeviewer pv
avec l'indicateur de nombre total d'octets -b
:
$ dd if=/dev/zero bs=3 count=4211 2>/dev/null | pv -b >/dev/null
12.3KiB
$ grep pattern file.txt | pv -b >/dev/null
L' utilitaire Pipe Viewer a été conçu à cet effet. S'il n'est pas suffisamment flexible pour vos besoins, vous pouvez implémenter votre propre code de mesure de transfert de données FIFO avec les appels de fonction de la bibliothèque de manipulation de pipeline ( libpipeline ) tels que pipeline_pump()
et pipeline_peek_size()
.
$ whatis pv
pv (1) - monitor the progress of data through a pipe
$ pv -Wi 0.002 -cf /etc/hosts | wc -l
367 B 0:00:00 [2.71MiB/s]
[============================================================================>]
100%
10
$
On pourrait rapidement brasser leur propre solution en Python:
#!/usr/bin/env python
import sys
count = 0
while True:
byte = sys.stdin.read(1)
if not byte:
break
count = count + 1
print(count)
Fonctionne ainsi:
$ echo "Hi" | ./count_stdin_bytes.py
3
$ echo "Hello" | ./count_stdin_bytes.py
6
$ dd if=/dev/zero bs=1 count=1024 2>/dev/null | ./count_stdin_bytes.py
1024
Étant donné que dans votre cas particulier, vous avez affaire à des données textuelles (à en juger par le fait que vous les canalisez grep
), vous pouvez également utiliser bash
les read
. Quelque chose comme ça:
$ echo "Hello" | { while read -n 1 char; do ((count++)) ;done ; echo $count; }
6
wc -c
? while read ...
sera probablement beaucoup plus lent. Aussi, OP a demandé une sortie lisible par l'homme comme dans ( ls -h
)
wc -c
parce quedu -h
renvoie `4,0 K` s'il est inférieur à 4,0k car il se lit en blocs