Відповіді:
Ви можете використовувати wc
для цього:
grep pattern file.txt | wc -c
буде рахувати кількість байтів у висновку. Ви можете переробити цей процес, щоб перетворити великі значення у формат "читабельний для людини" .
Ви також можете використовувати pv
цю інформацію всередині труби:
grep pattern file.txt | pv -b > output.txt
(тут відображається кількість оброблених байтів у читаному для людини форматі).
| wc -c | sed 's/$/\/1024\/1024/' | bc
. Це додає /1024/1024
до виводу та запустить калькулятор на отриманому рядку.
Ви можете використовувати інструмент 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
Для цього була розроблена утиліта 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
$
Можна швидко заварити власне рішення в 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
)
wc -c
тому щоdu -h
повертає `4,0 K`, якщо він менший 4,0 К, як він читається в блоках