Jak zmierzyć rozmiar przesyłanych danych?

16

Chciałbym zrobić coś takiego:

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

lub coś równoważnego do:

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

(byłoby to jednak trochę niewygodne)

Czy to jest możliwe?

Raffael
źródło

Odpowiedzi:

32

Możesz użyć wcdo tego:

grep pattern file.txt | wc -c

policzy liczbę bajtów na wyjściu. Możesz przetworzyć to, aby przekonwertować duże wartości na format „czytelny dla człowieka” .

Możesz także użyć pvtej informacji do umieszczenia w potoku:

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

(wyświetla liczbę przetworzonych bajtów w formacie czytelnym dla człowieka).

Stephen Kitt
źródło
1
Wolę, wc -cponieważ du -hzwraca wartość „4,0 K”, jeśli jest mniejsza niż 4,0 tys., Co czyta w blokach
Stan Strum
Jeśli wystarczy wydrukować wynik w MB, polecenie może być | wc -c | sed 's/$/\/1024\/1024/' | bc. To dołącza /1024/1024się do wyniku i uruchamia kalkulator na wynikowym ciągu.
phil294,
9

Możesz użyć narzędzia pipeviewer pvz flagą całkowitej liczby bajtów -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
źródło
3

W tym celu zaprojektowano narzędzie Pipe Viewer . Jeśli nie jest wystarczająco elastyczny dla twoich celów, możesz zaimplementować własny kod pomiaru transferu danych FIFO za pomocą wywołań funkcji biblioteki manipulacji ( libpipeline ), takich jak pipeline_pump()i 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
źródło
1

W Pythonie można szybko uwarzyć własne rozwiązanie:

#!/usr/bin/env python
import sys

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

print(count)

Działa tak:

$ 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

Ponieważ w danym przypadku mamy do czynienia z danymi tekstowymi (sądząc z faktu, że z rury grep), można również skorzystać z bash„s read. Coś takiego:

$ echo "Hello" | { while read -n 1 char; do ((count++)) ;done ; echo $count; }
6
Sergiy Kolodyazhnyy
źródło
Dlaczego to jest lepsze niż wc -c? while read ...prawdopodobnie będzie znacznie wolniejszy. Ponadto OP poprosił o przedstawienie czytelne dla człowieka, jak w ( ls -h)
phil294