पाइप्ड डेटा के आकार को कैसे मापें?


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

(यह मानव पठनीय प्रारूप में संसाधित बाइट्स की संख्या प्रदर्शित करता है)।


2
मैं पसंद करता हूं wc -cक्योंकि du -hरिटर्न prefer 4.0 K` है अगर यह किसी भी 4,0k से छोटा है क्योंकि यह ब्लॉकों में पढ़ता है
स्टेन

यदि MB में आउटपुट प्रिंट करना पर्याप्त है, तो कमांड हो सकती है | wc -c | sed 's/$/\/1024\/1024/' | bc। यह /1024/1024आउटपुट पर लागू होता है और परिणामस्वरूप स्ट्रिंग पर एक कैलकुलेटर चलाता है।
phil294


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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.