私はこのようなことをしたい:
> 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
使うこともできます。このような:bash
read
$ echo "Hello" | { while read -n 1 char; do ((count++)) ;done ; echo $count; }
6