¿Existe una herramienta estándar que convierta un recuento entero de bytes en un recuento legible por humanos del tamaño de unidad más grande posible, mientras se mantiene el valor numérico entre 1.00 y 1023.99?
Tengo mi propio script bash / awk, pero estoy buscando una herramienta estándar , que se encuentra en muchas / la mayoría de las distribuciones ... algo más generalmente disponible, e idealmente tiene argumentos simples de línea de comandos, y / o puede aceptar entradas entubada.
Aquí hay algunos ejemplos del tipo de salida que estoy buscando.
1 Byt
173.00 KiB
46.57 MiB
1.84 GiB
29.23 GiB
265.72 GiB
1.63 TiB
Aquí está el script bytes-humano (utilizado para la salida anterior)
awk -v pfix="$1" -v sfix="$2" 'BEGIN {
split( "Byt KiB MiB GiB TiB PiB", unit )
uix = uct = length( unit )
for( i=1; i<=uct; i++ ) val[i] = (2**(10*(i-1)))-1
}{ if( int($1) == 0 ) uix = 1; else while( $1 < val[uix]+1 ) uix--
num = $1 / (val[uix]+1)
if( uix==1 ) n = "%5d "; else n = "%8.2f"
printf( "%s"n" %s%s\n", pfix, num, unit[uix], sfix )
}'
Actualización Aquí hay una versión modificada del guión de Gilles , como se describe en un comentario a su respuesta ... (modificado para adaptarse a mi aspecto preferido).
awk 'function human(x) {
s=" B KiB MiB GiB TiB EiB PiB YiB ZiB"
while (x>=1024 && length(s)>1)
{x/=1024; s=substr(s,5)}
s=substr(s,1,4)
xf=(s==" B ")?"%5d ":"%8.2f"
return sprintf( xf"%s\n", x, s)
}
{gsub(/^[0-9]+/, human($1)); print}'
fuente
standard tool
creación :)Respuestas:
No, no existe una herramienta estándar de este tipo.
Desde GNU coreutils 8.21 (febrero de 2013, por lo que todavía no está presente en todas las distribuciones), en Linux y Cygwin no integrados, puede usar
numfmt
. No produce exactamente el mismo formato de salida (a partir de coreutils 8.23, no creo que pueda obtener 2 dígitos después de los puntos decimales).Muchas herramientas antiguas de GNU pueden producir este formato y la ordenación de GNU puede ordenar números con unidades desde coreutils 7.5 (agosto de 2009, tan presente en las distribuciones modernas de Linux no incrustadas).
Encuentro su código un poco complicado. Aquí hay una versión awk más limpia (el formato de salida no es exactamente idéntico):
( Publicado de una pregunta más especializada )
fuente
s
debería ser líderB
. Además, esta cadena se cambia fácilmente a notación binaria IEC. (2) Se salta el rango 1000-1023 a favor de 1 <tamaño siguiente> (fácil de cambiar) (3) No tiene valores decimales (que sí quiero). De nuevo, esto se cambia fácilmente. Cuando se muestran 2 lugares decimales, el%f
formato causa unround-up
<tamaño siguiente> para los valores 1019-1023 ; pero no vale la pena una solución alternativa. He publicado una versión modificada en mi respuesta, para referencia general.du
números a un formato legible para humanos, tenga en cuenta que es posible que deba agregar--block-size=1
aldu
comando.A partir del v.
8.21
,coreutils
Incluyenumfmt
:p.ej
AQUÍ se presentan varios otros ejemplos (incluido el filtrado, el procesamiento de entrada / salida, etc.) .
Además, a partir de
coreutils
v.8.24
,numfmt
Puede procesar múltiples campos con especificaciones de rango de campo similarescut
y admite la configuración de la precisión de salida con la--format
opción,por ejemplo
fuente
Aquí hay una opción de solo bash, ninguna
bc
o ninguna otra no integrada, + formato decimal y unidades binarias.Ejemplos:
Debería funcionar bien en cualquier versión de Bash (incluida MSYSGit's Bash para Windows).
fuente
Esta es una reescritura completa inspirada en la versión modificada de Peter.O del guión awk de Gilles.
Cambios:
Código:
Casos de prueba (si desea ver la salida):
¡Disfrutar!
fuente
Hay un par de
perl
módulos en CPAN: Formato :: Humano :: Bytes y Número :: Bytes :: Humano , el último es un poco más completo:Y a la inversa:
NOTA: la función
parse_bytes()
se agregó en la versión 0.09 (2013-03-01)fuente
Via linux: ¿hay una calculadora de línea de comandos para los cálculos de bytes? - Desbordamiento de pila , encontré sobre unidades GNU , aunque sin ejemplos en la página SO; y como no lo vi listado aquí, aquí hay una pequeña nota al respecto.
Primero, verifique si las unidades están presentes:
Dado que lo son, realice una conversión: los
printf
especificadores de formato se aceptan para formatear el resultado numérico:fuente
En realidad, hay una utilidad que hace exactamente esto. Lo sé porque fui yo quien lo escribió. Fue escrito para * BSD pero debería compilarse en Linux si tiene las bibliotecas BSD (que creo que son comunes).
Acabo de lanzar una nueva versión, publicada aquí:
http://blog.frankleonhardt.com/2015/freebsd-hr-utility-human-readable-number-filter-man-page/
Se llama hr, y tomará stdin (o archivos) y convertirá números a formato legible para humanos de una manera que (ahora) sea exactamente la misma que ls -h y así sucesivamente, y puede seleccionar feeds individuales en líneas, escala unidades preescaladas (por ejemplo, si están en bloques de 512 bytes, conviértalas a Mb, etc.), ajuste el relleno de la columna, etc.
Lo escribí hace unos años porque pensé que tratar de escribir un script de shell, aunque intelectualmente interesante, también era una locura total.
Usando hr, por ejemplo, puede obtener fácilmente una lista ordenada de tamaños de directorio (que salen en unidades de 1Kb y necesitan desplazamiento antes de convertir) con lo siguiente:
du -d1 | ordenar -n | hr -sK
Si bien du producirá la salida -h, sort no lo ordenará. La adición de -h a las utilidades existentes es un caso clásico de no seguir la filosofía de Unix: tener utilidades simples que realicen trabajos bien definidos.
fuente
Aquí hay una manera de hacerlo casi exclusivamente en bash, solo necesita 'bc' para las matemáticas de coma flotante.
Uso:
Salida:
fuente
Da:
Lamentablemente, no puedo entender cómo obtener la precisión de dos decimales. Probado en Ubuntu 14.04.
fuente
La primera respuesta de @ don_crissti es buena, pero puede ser aún más corta usando Here Strings , p. ej.
o incluso
si
<<<
no está disponible, puede usar, por ejemplofuente
Existen herramientas de Python
No veo un indicador --binary :(, por lo que tendría que usar python directamente para la representación binaria:
fuente
Tuve el mismo problema y rápidamente se me ocurrió una solución simple usando
awk
lalog()
función:Y la precisión perdida al usar números flotantes no es tan mala ya que esa precisión se perderá de todos modos.
fuente
La respuesta a tu pregunta es sí.
Si bien el formato de salida no se ajusta exactamente a sus especificaciones, la conversión en sí se realiza fácilmente con una herramienta muy estándar (o dos) . A los que me refiero son
dc
ybc
. Puede obtener un informe segmentado alterando sus radices de salida. Me gusta esto:... que imprime ...
Lo uso
dc
porque es un favorito personal, perobc
puede hacer lo mismo con una sintaxis diferente y se adhiere a las mismas reglas de formato especificadas por POSIX como:bc
obsequiarbc
deberá escribir números decimales de dos dígitos; para bases de 101 a 1000, cadenas decimales de tres dígitos, etc. Por ejemplo, el número decimal 1024 en la base 25 se escribiría como:01 15 24
y en base 125, como:
008 024
fuente
Solución corta y dulce, solo con cáscara:
No muestra la poción decimal.
El
let VAR=expression
es Korn-ish. SustitúyaloVAR=$(( expression ))
por Born-again-ish.fuente
AFAIK no existe una herramienta estándar a la que pueda pasar texto y devuelve una forma legible por humanos. Es posible que pueda encontrar un paquete para realizar dicha tarea para su distribución.
Sin embargo, no entiendo por qué puede necesitar dicha herramienta. La mayoría de los paquetes que dan una salida relacionada, generalmente tienen un interruptor -h o equivalente para una salida legible por humanos.
fuente