Me gustaría hacer algo como esto:
> grep pattern file.txt | size -h
16.4 MB
o algo equivalente a:
> grep pattern file.txt > grepped.txt
> ls -h grepped.txt
16.4 MB
> rm grepped.txt
(aunque eso sería un poco incómodo)
¿Es eso posible?
Puedes usar wc
para esto:
grep pattern file.txt | wc -c
contará el número de bytes en la salida. Puede postprocesar eso para convertir valores grandes a formato "legible para humanos" .
También puede usar pv
para obtener esta información dentro de una tubería:
grep pattern file.txt | pv -b > output.txt
(esto muestra el número de bytes procesados, en formato legible por humanos).
wc -c
porquedu -h
devuelve `4.0 K` si es más pequeño que 4,0k mientras lee en bloques| wc -c | sed 's/$/\/1024\/1024/' | bc
. Esto se agrega/1024/1024
a la salida y ejecuta una calculadora en la cadena resultante.Puede utilizar la herramienta pipeviewer
pv
con la bandera recuento total de bytes-b
:fuente
La utilidad Pipe Viewer fue diseñada para este propósito. Si no es lo suficientemente flexible para sus propósitos, puede implementar su propio código de medición de transferencia de datos FIFO con las llamadas a funciones de la biblioteca de manipulación de tuberías ( libpipeline ) como
pipeline_pump()
ypipeline_peek_size()
.fuente
Uno podría elaborar rápidamente su propia solución en Python:
Funciona así:
Dado que en su caso particular se trata de datos de texto (a juzgar por el hecho de que realiza la canalización
grep
), también puede hacer uso debash
'sread
. Algo como esto:fuente
wc -c
?while read ...
probablemente será significativamente más lento. Además, OP solicitó una salida legible para humanos como en (ls -h
)