Câu trả lời:
Bạn có thể sử dụng wc
cho việc này:
grep pattern file.txt | wc -c
sẽ đếm số byte trong đầu ra. Bạn có thể xử lý hậu kỳ để chuyển đổi các giá trị lớn sang định dạng có thể đọc được của con người .
Bạn cũng có thể sử dụng pv
để có được thông tin này trong một đường ống:
grep pattern file.txt | pv -b > output.txt
(điều này hiển thị số byte được xử lý, ở định dạng có thể đọc được).
| wc -c | sed 's/$/\/1024\/1024/' | bc
. Điều này nối /1024/1024
vào đầu ra và chạy một máy tính trên chuỗi kết quả.
Bạn có thể sử dụng công cụ pipeviewer pv
với cờ đếm tổng byte -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
Các ống Viewer tiện ích được thiết kế cho mục đích này. Nếu nó không đủ linh hoạt cho mục đích của bạn, thì bạn có thể triển khai mã đo lường truyền dữ liệu FIFO của riêng bạn với các lệnh gọi hàm thư viện thao tác đường ống ( libpipeline ) như pipeline_pump()
và 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
$
Người ta có thể nhanh chóng pha giải pháp của riêng họ trong 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)
Hoạt động như vậy:
$ 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
Vì trong trường hợp cụ thể của bạn, bạn đang làm việc với dữ liệu văn bản (đánh giá từ thực tế là bạn đường ống từ grep
), bạn cũng có thể tận dụng bash
's read
. Một cái gì đó như thế này:
$ echo "Hello" | { while read -n 1 char; do ((count++)) ;done ; echo $count; }
6
wc -c
? while read ...
có lẽ sẽ chậm hơn đáng kể Ngoài ra, OP đã yêu cầu đầu ra có thể đọc được của con người như trong ( ls -h
)
wc -c
vìdu -h
trả về `4.0 K` nếu nó nhỏ hơn 4.0k khi đọc theo khối