Comment mesurer la taille des données canalisées?

16

Je voudrais faire quelque chose comme ça:

> grep pattern file.txt | size -h
16.4 MB

ou quelque chose d'équivalent à:

> grep pattern file.txt > grepped.txt
> ls -h grepped.txt
16.4 MB
> rm grepped.txt

(ce serait un peu gênant, cependant)

Est-ce possible?

Raffael
la source

Réponses:

32

Vous pouvez utiliser wcpour 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 pvpour 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).

Stephen Kitt
la source
1
Je préfère wc -cparce que du -hrenvoie `4,0 K` s'il est inférieur à 4,0k car il se lit en blocs
Stan Strum
Si l'impression de la sortie en Mo suffit, la commande pourrait l'être | 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.
phil294
9

Vous pouvez utiliser l'outil pipeviewer pvavec 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
Bjarke Freund-Hansen
la source
3

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
$
Derek Callaway
la source
1

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 bashles read. Quelque chose comme ça:

$ echo "Hello" | { while read -n 1 char; do ((count++)) ;done ; echo $count; }
6
Sergiy Kolodyazhnyy
la source
Pourquoi est-ce mieux que wc -c? while read ...sera probablement beaucoup plus lent. Aussi, OP a demandé une sortie lisible par l'homme comme dans ( ls -h)
phil294