パイプラインデータのサイズを測定する方法は?

パイプラインデータのサイズを測定する方法は?

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

> 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

(しかしちょっと不快に思える)

それは可能ですか?

答え1

次の目的で使用できますwc

grep pattern file.txt | wc -c

出力のバイト数が計算されます。後処理してください大きな値を「人間が読める」形式に変換

また、使用することができますpvパイプライン内でこの情報を取得するには、次のようにします。

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

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

答え2

パイプラインビューアツールを使用できます。pv合計バイト数を示すフラグ-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

これパイプビューアユーティリティはこの目的のために設計されています。目的に合わせて十分に柔軟でない場合は、パイプ操作ライブラリ(図書館パイプライン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
$

答え4

人々は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使うこともできます。このような:bashread

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

関連情報