Як виміряти розмір трубних даних?


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,0 К, як він читається в блоках
Stan Strum

Якщо друкується вихід у МБ, команда може бути | 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

Для цього була розроблена утиліта Pipe 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), ви також можете використовувати bash«з read. Щось на зразок цього:

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

Чому це краще, ніж wc -c? while read ...ймовірно, буде значно повільніше. Також ОП попросив читати людину результатів, як у ( ls -h)
phil294
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.