Bagaimana mengukur ukuran data yang disalurkan?


16

Saya ingin melakukan sesuatu seperti ini:

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

atau sesuatu yang setara dengan:

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

(Itu akan sedikit merepotkan, meskipun)

Apakah itu mungkin?

Jawaban:


32

Anda dapat menggunakan wcini:

grep pattern file.txt | wc -c

akan menghitung jumlah byte dalam output. Anda dapat memposting proses itu untuk mengonversi nilai besar ke format “dapat dibaca manusia” .

Anda juga dapat menggunakan pvuntuk mendapatkan informasi ini di dalam pipa:

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

(ini menampilkan jumlah byte yang diproses, dalam format yang dapat dibaca manusia).


1
Saya lebih suka wc -ckarena du -hmengembalikan `4.0 K` jika lebih kecil dari 4.0k karena terbaca dalam blok
Stan Strum

Jika mencetak output dalam MB sudah cukup, perintahnya bisa | wc -c | sed 's/$/\/1024\/1024/' | bc. Ini ditambahkan /1024/1024ke output dan menjalankan kalkulator pada string yang dihasilkan.
phil294

9

Anda dapat menggunakan alat pipeviewer pvdengan flag jumlah byte total -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

The Pipe Viewer utilitas dirancang untuk tujuan ini. Jika tidak cukup fleksibel untuk keperluan Anda, maka Anda dapat menerapkan kode pengukuran transfer data FIFO Anda sendiri dengan pemanggilan fungsi library manipulation pipeline ( libpipeline ) seperti pipeline_pump()dan 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

Orang dapat dengan cepat membuat solusi mereka sendiri dengan 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)

Bekerja seperti itu:

$ 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

Karena dalam kasus tertentu Anda berurusan sedang dengan data teks (kalau dilihat dari kenyataan bahwa Anda pipa dari grep), Anda bisa juga menggunakan bash's read. Sesuatu seperti ini:

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

Mengapa ini lebih baik daripada wc -c? while read ...mungkin akan secara signifikan lebih lambat. Juga, OP meminta output yang dapat dibaca manusia seperti pada ( ls -h)
phil294
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.