Wie misst man die Größe von Pipe-Daten?


16

Ich würde gerne so etwas machen:

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

oder etwas äquivalent zu:

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

(das wäre allerdings etwas umständlich)

Ist das möglich?

Antworten:


32

Sie können dafür verwenden wc:

grep pattern file.txt | wc -c

zählt die Anzahl der Bytes in der Ausgabe. Sie können dies nachbearbeiten, um große Werte in ein für Menschen lesbares Format zu konvertieren .

Sie können auch verwenden pv, um diese Informationen in einer Pipe abzurufen:

grep pattern file.txt | pv -b > output.txt

(Dies zeigt die Anzahl der verarbeiteten Bytes in einem für Menschen lesbaren Format an.)


1
Ich bevorzuge, wc -cweil du -h"4,0 K" zurückgibt, wenn es kleiner als 4,0 K ist, da es in Blöcken liest
Stan Strum

Wenn das Drucken der Ausgabe in MB ausreicht, könnte der Befehl lauten | wc -c | sed 's/$/\/1024\/1024/' | bc. Dies hängt /1024/1024an die Ausgabe an und führt einen Taschenrechner für die resultierende Zeichenfolge aus.
phil294

9

Sie können das Pipeviewer-Tool pvmit dem Flag für die Gesamtbytezahl verwenden -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

Das Pipe Viewer- Dienstprogramm wurde zu diesem Zweck entwickelt. Wenn es für Ihre Zwecke nicht flexibel genug ist, können Sie mit den Funktionsaufrufen der Pipeline-Manipulationsbibliothek ( libpipeline ) wie pipeline_pump()und Ihren eigenen FIFO- Messcode für die Datenübertragung implementieren 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

In Python konnte man schnell seine eigene Lösung brauen:

#!/usr/bin/env python
import sys

count = 0
while True:
    byte = sys.stdin.read(1)
    if not byte:
        break
    count =  count + 1

print(count)

Funktioniert so:

$ 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

Da in Ihrem speziellen Fall , dass Sie es zu tun mit Textdaten (Geht man von der Tatsache , dass Sie Rohr aus grep), können Sie auch Gebrauch machen bash‚s read. Etwas wie das:

$ echo "Hello" | { while read -n 1 char; do ((count++)) ;done ; echo $count; }
6

Warum ist das besser als wc -c? while read ...wird wahrscheinlich deutlich langsamer sein. Außerdem forderte OP eine vom Menschen lesbare Ausgabe wie in ( ls -h)
phil294,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.