วิธีการวัดขนาดของข้อมูล piped?


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.0 K 'ถ้ามันเล็กกว่า 4,0k เพราะมันอ่านในบล็อก
Stan Strum

หากพิมพ์ผลลัพธ์เป็น MB ก็เพียงพอคำสั่งอาจเป็น| wc -c | sed 's/$/\/1024\/1024/' | bcได้ ส่วนนี้/1024/1024จะผนวกกับเอาต์พุตและเรียกใช้เครื่องคิดเลขบนสตริงผลลัพธ์
phil294

9

คุณสามารถใช้เครื่องมือ pipeviewer 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

ท่อ Viewerยูทิลิตี้ได้รับการออกแบบมาเพื่อการนี้ ถ้ามันยังไม่พอมีความยืดหยุ่นสำหรับวัตถุประสงค์ของคุณแล้วคุณสามารถใช้รหัสของคุณเองการถ่ายโอนข้อมูลแบบ FIFO วัดกับคลังจัดการท่อ ( libpipeline ) การเรียกฟังก์ชันเช่นและ 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) นอกจากนี้คุณยังสามารถใช้ประโยชน์จาก'sbash 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.