Borulu verilerin boyutu nasıl ölçülür?


16

Böyle bir şey yapmak istiyorum:

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

veya şuna eşdeğer bir şey:

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

(bu biraz rahatsız edici olurdu)

Mümkün mü?

Yanıtlar:


32

Bunun için kullanabilirsiniz wc:

grep pattern file.txt | wc -c

çıktıdaki bayt sayısını sayar. Büyük değerleri “insan tarafından okunabilir” biçime dönüştürmek için bu işlemi sonlandırabilirsiniz .

pvBu bilgileri bir kanalın içine almak için de kullanabilirsiniz :

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

(işlenen bayt sayısını insan tarafından okunabilir biçimde görüntüler).


2
Tercih ederim, wc -cçünkü du -hbloklarda okunduğu gibi 4.0k'den küçükse `4.0 K` döndürür
Stan Strum

Çıktıyı MB olarak yazdırmak yeterliyse, komut olabilir | wc -c | sed 's/$/\/1024\/1024/' | bc. Bu /1024/1024, çıktıya eklenir ve elde edilen dize üzerinde bir hesap makinesi çalıştırır.
phil294

9

Pipeviewer aracını pvtoplam bayt sayısı bayrağıyla kullanabilirsiniz -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

Boru Görüntüleyici yarar bu amaçla tasarlanmıştır. Amaçlarınız için yeterince esnek değilse , ve gibi F boru hattı manipülasyon kütüphanesi ( libpipeline ) fonksiyon çağrıları ile kendi FIFO veri transferi ölçüm kodunuzu uygulayabilirsiniz . pipeline_pump()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

Python'da hızlı bir şekilde kendi çözümünü oluşturabilir:

#!/usr/bin/env python
import sys

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

print(count)

Şu şekilde çalışır:

$ 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

Özel durumunuzda metin verileriyle uğraştığınızdan (borsada bulunduğunuzdan yola çıkarak grep), bash's read. Bunun gibi bir şey:

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

Bu neden daha iyi wc -c? while read ...Muhtemelen daha yavaş olacaktır. Ayrıca, OP ( ls -h) gibi insan tarafından okunabilir çıktı istedi
phil294
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.