Existe-t-il un outil standard qui convertit un nombre entier d'octets en un nombre lisible par l'homme de la plus grande taille d'unité possible, tout en maintenant la valeur numérique entre 1,00 et 1023,99?
J'ai mon propre script bash / awk, mais je recherche un outil standard , que l'on trouve sur de nombreuses / la plupart des distributions ... quelque chose de plus disponible, et idéalement avec de simples arguments en ligne de commande, et / ou pouvant accepter une entrée dérivée.
Voici quelques exemples du type de sortie que je recherche.
1 Byt
173.00 KiB
46.57 MiB
1.84 GiB
29.23 GiB
265.72 GiB
1.63 TiB
Voici le script octets-humain (utilisé pour la sortie ci-dessus)
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 )
}'
Mise à jour Voici une version modifiée du script de Gilles , telle que décrite dans un commentaire à sa réponse. (Modifiée pour correspondre à mon look préféré).
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}'
la source
standard tool
en train de se faire :)Réponses:
Non, il n'y a pas d'outil standard.
Depuis GNU coreutils 8.21 (février 2013, donc pas encore présent dans toutes les distributions), sur Linux non intégré et Cygwin, vous pouvez utiliser
numfmt
. Il ne produit pas exactement le même format de sortie (à partir de Coreutils 8.23, je ne pense pas que vous puissiez obtenir 2 chiffres après la virgule décimale).De nombreux outils GNU plus anciens peuvent produire ce format et le tri GNU peut trier les nombres en unités depuis coreutils 7.5 (août 2009, si présent sur les distributions Linux non intégrées modernes).
Je trouve votre code un peu compliqué. Voici une version plus claire d'awk (le format de sortie n'est pas exactement identique):
( Republié d'une question plus spécialisée )
la source
s
devrait être en têteB
. De plus, cette chaîne est facilement remplacée par la notation binaire IEC. (2) Il saute la plage 1000-1023 en faveur de 1 <taille suivante> (facilement modifiable) (3) Il n’a pas de valeur décimale (ce que je veux). Encore une fois cela est facilement changé. Lorsqu’il affiche 2 décimales, le%f
format entraîneround-up
l’a <taille suivante> pour les valeurs 1019-1023 ; mais cela ne vaut pas une solution de contournement .. J'ai posté une version modifiée dans ma réponse, pour référence générale.du
nombres en format lisible par l'homme, notez qu'il peut être nécessaire d'ajouter--block-size=1
à ladu
commande.À partir de v.
8.21
,coreutils
Comprendnumfmt
:par exemple
Divers autres exemples (y compris le filtrage, le traitement des entrées / sorties, etc.) sont présentés ICI .
En outre, à partir de
coreutils
v.8.24
,numfmt
Peut traiter plusieurs champs avec des spécifications de plage de champs similaires àcut
, et prend en charge le réglage de la précision de sortie avec l'--format
option,par exemple
la source
Voici une option uniquement bash, aucun
bc
ou aucun autre élément non intégré, + format décimal et unités binaires.Exemples:
Devrait bien fonctionner sur n'importe quelle version de Bash (y compris Bash de MSYSGit pour Windows).
la source
Il s’agit d’une réécriture complète inspirée de la version modifiée du script awk de Gilles par Peter.O.
Changements:
Code:
Cas de test (si vous voulez regarder le résultat):
Prendre plaisir!
la source
Il y a quelques
perl
modules sur CPAN: Format :: Humain :: Octets et Nombre :: Octets :: Humain , le dernier étant un peu plus complet:Et l'inverse:
REMARQUE: la fonction a
parse_bytes()
été ajoutée à la version 0.09 (2013-03-01).la source
Via linux - Existe-t-il un calculateur en ligne de commande pour le calcul des octets? - Stack Overflow , j'ai trouvé des informations sur les unités GNU - bien que sans exemples sur la page SO; et comme je ne l'ai pas vu ici, voici une petite note à ce sujet.
Tout d’abord, vérifiez si les unités sont présentes:
Etant donné qu'ils le sont, effectuez une conversion - les
printf
spécificateurs de format sont acceptés pour formater le résultat numérique:la source
En fait, il existe un utilitaire qui fait exactement cela. Je sais que c’est moi qui l’ai écrit. Il a été écrit pour * BSD mais devrait être compilé sous Linux si vous avez les bibliothèques BSD (que je pense être communes).
Je viens de publier une nouvelle version, postée ici:
http://blog.frankleonhardt.com/2015/freebsd-hr-utility-human-readable-number-filter-man-page/
Il s’appelle hr. Il faut stdin (ou fichiers) et convertit les nombres en format lisible par l’homme de la même manière que ls -h, etc., et permet de sélectionner des flux individuels en lignes, à l’échelle les unités pré-dimensionnées (par exemple, si elles sont en blocs de 512 octets, convertissez-les en Mo, etc.), ajustez le remplissage de la colonne, etc.
Je l'ai écrit il y a quelques années parce que je pensais qu'essayer d'écrire un script shell, bien que intellectuellement intéressant, était aussi une folie totale.
En utilisant, par exemple, hr, vous pouvez facilement obtenir une liste triée des tailles de répertoires (exprimées en unités de 1 Ko et devant être décalées avant la conversion) avec les éléments suivants:
du -d1 | trier -n | hr
Bien que du produise une sortie -h, le tri ne triera pas en fonction. L'ajout de -h aux utilitaires existants est un cas classique de non-respect de la philosophie unix: disposer d'utilitaires simples effectuant très bien des tâches définies.
la source
Voici une façon de le faire presque purement en bash, il suffit de «bc» pour le calcul en virgule flottante.
Usage:
Sortie:
la source
Donne:
Malheureusement, je n'arrive pas à comprendre comment obtenir une précision à deux décimales. Testé sur Ubuntu 14.04.
la source
La première réponse de @ don_crissti est bonne, mais peut être encore plus courte avec Here Strings , par exemple
ou même
si
<<<
n'est pas disponible, vous pouvez utiliser par exemplela source
Les outils Python existent
Je ne vois pas d'indicateur --binary :(, vous devriez donc utiliser directement python pour la représentation binaire:
la source
J'ai eu le même problème et j'ai rapidement trouvé une solution simple en utilisant
awk
lalog()
fonction de:Et la précision perdue en utilisant des nombres flottants n’est pas si mauvaise que ça, car cette précision sera perdue de toute façon.
la source
La réponse à ta question est oui.
Bien que le format de sortie ne corresponde pas exactement à vos spécifications, la conversion elle-même est facilement réalisée par un outil très standard (ou deux) . Ceux auxquels je me réfère sont
dc
etbc
. Vous pouvez obtenir un rapport segmenté en modifiant leurs radices de sortie. Comme ça:... qui imprime ...
J'utilise
dc
ci-dessus parce que c'est un favori personnel, maisbc
je peux faire la même chose avec une syntaxe différente et adhérer aux mêmes règles de format que celles spécifiées par POSIX comme:bc
obasebc
doit écrire des nombres décimaux à deux chiffres; pour les bases de 101 à 1000, chaînes décimales à trois chiffres, etc. Par exemple, le nombre décimal 1024 en base 25 s’écrit comme suit:01 15 24
et en base 125, comme:
008 024
la source
Solution courte et douce, coquille uniquement:
Il ne montre pas la potion décimale.
Le
let VAR=expression
est Korn-ish. Substitute avecVAR=$(( expression ))
pour Born-again-ish.la source
Autant que je sache, il n’existe aucun outil standard de ce type auquel vous pouvez passer du texte et il renvoie un formulaire lisible par l’homme. Vous pourrez peut-être trouver un paquet pour accomplir cette tâche pour votre distribution.
Cependant, je ne comprends pas pourquoi vous pourriez avoir besoin d’un tel outil. La plupart des paquets qui donnent une sortie associée ont généralement un commutateur -h ou équivalent pour une sortie lisible par l'homme.
la source