파이프 데이터의 크기를 측정하는 방법은 무엇입니까?


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
블록 단위로 읽을 때 4,0k보다 작은 경우`4.0K`를 반환 wc -c하기 때문에 선호 du -h합니다
Stan Strum

출력을 MB 단위로 인쇄하는 것으로 충분하면 명령은입니다 | wc -c | sed 's/$/\/1024\/1024/' | bc. /1024/1024출력에 추가 되고 결과 문자열에서 계산기를 실행합니다.
phil294

9

pv총 바이트 수 플래그와 함께 pipeviewer 도구 를 사용할 수 있습니다 -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

파이프 뷰어 유틸리티는이 목적을 위해 설계되었습니다. 그것은 당신의 목적을 위해 유연 충분하지 않으면, 당신은 파이프 라인 조작 라이브러리 자신의 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

파이썬에서 자신의 솔루션을 빠르게 만들 수 있습니다.

#!/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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.