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?

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).


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

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
$

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.