Odpowiedzi:
Możesz użyć wc
do tego:
grep pattern file.txt | wc -c
policzy liczbę bajtów na wyjściu. Możesz przetworzyć to, aby przekonwertować duże wartości na format „czytelny dla człowieka” .
Możesz także użyć pv
tej informacji do umieszczenia w potoku:
grep pattern file.txt | pv -b > output.txt
(wyświetla liczbę przetworzonych bajtów w formacie czytelnym dla człowieka).
| wc -c | sed 's/$/\/1024\/1024/' | bc
. To dołącza /1024/1024
się do wyniku i uruchamia kalkulator na wynikowym ciągu.
Możesz użyć narzędzia pipeviewer pv
z flagą całkowitej liczby bajtów -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
W tym celu zaprojektowano narzędzie Pipe Viewer . Jeśli nie jest wystarczająco elastyczny dla twoich celów, możesz zaimplementować własny kod pomiaru transferu danych FIFO za pomocą wywołań funkcji biblioteki manipulacji ( libpipeline ), takich jak pipeline_pump()
i 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
$
W Pythonie można szybko uwarzyć własne rozwiązanie:
#!/usr/bin/env python
import sys
count = 0
while True:
byte = sys.stdin.read(1)
if not byte:
break
count = count + 1
print(count)
Działa tak:
$ 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
Ponieważ w danym przypadku mamy do czynienia z danymi tekstowymi (sądząc z faktu, że z rury grep
), można również skorzystać z bash
„s read
. Coś takiego:
$ echo "Hello" | { while read -n 1 char; do ((count++)) ;done ; echo $count; }
6
wc -c
? while read ...
prawdopodobnie będzie znacznie wolniejszy. Ponadto OP poprosił o przedstawienie czytelne dla człowieka, jak w ( ls -h
)
wc -c
ponieważdu -h
zwraca wartość „4,0 K”, jeśli jest mniejsza niż 4,0 tys., Co czyta w blokach