我想做这样的事情:
> 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
(不过这样会有点不方便)
那可能吗?
答案1
您可以wc
为此使用:
grep pattern file.txt | wc -c
将计算输出中的字节数。您可以对其进行后处理将大值转换为“人类可读”格式。
您还可以使用pv
要在管道内获取此信息:
grep pattern file.txt | pv -b > output.txt
(这以人类可读的格式显示处理的字节数)。
答案2
您可以使用管道查看器工具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
这管道查看器实用程序就是为此目的而设计的。如果它对于您的目的来说不够灵活,那么您可以使用管道操作库实现您自己的 FIFO 数据传输测量代码(库管道) 函数调用,例如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
$
答案4
人们可以用 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
's read
。像这样的东西:
$ echo "Hello" | { while read -n 1 char; do ((count++)) ;done ; echo $count; }
6