Làm thế nào để đo kích thước của dữ liệu đường ống?


16

Tôi muốn làm một cái gì đó như thế này:

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

hoặc một cái gì đó tương đương với:

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

(điều đó sẽ hơi bất tiện)

Điều đó có thể không?

Câu trả lời:


32

Bạn có thể sử dụng wccho 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).


1
Tôi thích wc -cdu -htrả về `4.0 K` nếu nó nhỏ hơn 4.0k khi đọc theo khối
Stan Strum

Nếu in đầu ra bằng MB là đủ, lệnh có thể | wc -c | sed 's/$/\/1024\/1024/' | bc. Điều này nối /1024/1024vào đầu ra và chạy một máy tính trên chuỗi kết quả.
phil294

9

Bạn có thể sử dụng công cụ pipeviewer pvvớ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

3

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()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

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

Tại sao điều này tốt hơn 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)
phil294
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.