パイプされたデータのサイズを測定する方法は?


16

私はこのようなことをしたいと思います:

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

または同等のもの:

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

(しかし、それは少し不便でしょう)

それは可能ですか?

回答:


32

wcこれに使用できます:

grep pattern file.txt | wc -c

出力のバイト数をカウントします。それ後処理して、大きな値を「人間が読める」形式に変換することができます

pvパイプ内でこの情報を取得するためにも使用できます。

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

(これは処理されたバイト数を人間が読める形式で表示します)。


1
私が好むwc -cのでdu -h、それはブロック単位で読み込むようには4,0kよりどんな小さい場合リターン`4.0 K '
スタン・ストラム

出力をMBで印刷するだけで十分な場合、コマンドは次のようになります| wc -c | sed 's/$/\/1024\/1024/' | bc。これは/1024/1024出力に追加し、結果の文字列で計算機を実行します。
phil294


3

パイプビューアユーティリティは、この目的のために設計されました。目的に対して十分な柔軟性がない場合は、およびなどのパイプライン操作ライブラリ(libpipeline)関数呼び出しを使用して、独自のFIFOデータ転送測定コードを実装できます。 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で独自のソリューションをすばやく作成できます。

#!/usr/bin/env python
import sys

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

print(count)

そのように動作します:

$ 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

あなたの特定のケースであなたのテキストデータとしている取引は、(からあなたがパイプその事実から判断するのでgrep)、あなたはまたの使用作ることができるbashのをread。このようなもの:

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

なぜこれがより良いのですwc -cか?while read ...おそらく大幅に遅くなります。また、OPは(のように人間が読める出力を求めたls -h
phil294
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.