Gibt es ein Standard-Tool , das eine Ganzzahl von Bytes in eine vom Menschen lesbare Zahl mit der größtmöglichen Einheitengröße umwandelt, während der numerische Wert zwischen 1,00 und 1023,99 liegt?
Ich habe mein eigenes Bash / Awk-Skript, suche aber ein Standard- Tool, das in vielen / den meisten Distributionen zu finden ist ... etwas allgemeineres, und idealerweise einfache Befehlszeilenargumente hat und / oder Pipe-Eingaben akzeptiert.
Hier sind einige Beispiele für die Art der Ausgabe, die ich suche.
1 Byt
173.00 KiB
46.57 MiB
1.84 GiB
29.23 GiB
265.72 GiB
1.63 TiB
Hier ist das bytes-human- Skript (wird für die obige Ausgabe verwendet)
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 )
}'
Update Hier ist eine modifizierte Version von Gilles ' Skript, wie in einem Kommentar zu seiner Antwort beschrieben.
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}'
text-processing
utilities
units
Peter.O
quelle
quelle
standard tool
in der Herstellung :)Antworten:
Nein, es gibt kein solches Standardwerkzeug.
Seit GNU Coreutils 8.21 (Februar 2013, also noch nicht in allen Distributionen vorhanden) können Sie auf nicht eingebettetem Linux und Cygwin verwenden
numfmt
. Es wird nicht genau dasselbe Ausgabeformat erzeugt (ab Coreutils 8.23 kann man meines Erachtens keine 2 Nachkommastellen erhalten).Viele ältere GNU-Tools können dieses Format erzeugen und GNU-Sortierung kann Zahlen mit Einheiten seit Coreutils 7.5 sortieren (August 2009, also auf modernen, nicht eingebetteten Linux-Distributionen vorhanden).
Ich finde Ihren Code ein bisschen verworren. Hier ist eine sauberere awk-Version (das Ausgabeformat ist nicht genau identisch):
( Reposted von einer spezielleren Frage )
quelle
s
sollte führend seinB
. Auch diese Zeichenfolge kann leicht in die IEC-Binärnotation geändert werden. (2) Der 1000-1023- Bereich wird zugunsten von 1 <nächste Größe> übersprungen (leicht zu ändern). (3) Es gibt keine Dezimalwerte (was ich will). Auch dies lässt sich leicht ändern. Wenn 2 Dezimalstellen angezeigt werden,%f
bewirkt das Format, dassround-up
für die Werte 1019-1023 ein bis <nächste Größe> angezeigt wird . Aber es ist keine Umgehung wert. Ich habe eine modifizierte Version in meiner Antwort veröffentlicht, um allgemeine Hinweise zu geben.du
Zahlen in ein für Menschen lesbares Format konvertieren möchten , beachten Sie, dass Sie möglicherweise--block-size=1
dendu
Befehl hinzufügen müssen .Ab v.
8.21
,coreutils
Umfasstnumfmt
:z.B
Verschiedene andere Beispiele (einschließlich Filterung, Eingabe- / Ausgabeverarbeitung usw.) werden HIER vorgestellt .
Darüber hinaus, wie von
coreutils
v.8.24
,numfmt
Kann mehrere Felder mit Feldbereich Spezifikationen ähnlich verarbeitencut
, und unterstützt die Einstellung der Ausgangspräzision mit der--format
Option ,zB
quelle
Hier ist eine
bc
reine Bash-Option, keine oder andere nicht eingebaute Elemente, + Dezimalformat und binäre Einheiten.Beispiele:
Sollte auf jeder Bash-Version (einschließlich MSYSGits Bash für Windows) eine gute Leistung bringen.
quelle
Dies ist eine komplette Neufassung, inspiriert von Peter.Os modifizierter Version von Gilles 'awk-Skript.
Änderungen:
Code:
Testfälle (wenn Sie sich die Ausgabe ansehen möchten):
Genießen!
quelle
Es gibt ein paar
perl
Module im CPAN: Format :: Human :: Bytes und Number :: Bytes :: Human , wobei das letztere etwas vollständiger ist:Und umgekehrt:
HINWEIS: Die Funktion
parse_bytes()
wurde in Version 0.09 (2013-03-01) hinzugefügt.quelle
Über Linux - Gibt es einen Befehlszeilenrechner für Byte-Berechnungen? - Stapelüberlauf , ich fand über GNU-Einheiten - obwohl ohne Beispiele auf der SO-Seite; und da ich es hier nicht aufgelistet gesehen habe, ist hier eine kleine Notiz darüber.
Überprüfen Sie zunächst, ob die Einheiten vorhanden sind:
Wenn dies der Fall ist, führen Sie eine Konvertierung durch.
printf
Formatspezifizierer werden akzeptiert, um das numerische Ergebnis zu formatieren:quelle
Tatsächlich gibt es ein Dienstprogramm, das genau dies tut. Ich weiß, weil ich es geschrieben habe. Es wurde für * BSD geschrieben, sollte aber unter Linux kompiliert werden, wenn Sie die BSD-Bibliotheken haben (von denen ich glaube, dass sie üblich sind).
Ich habe gerade eine neue Version veröffentlicht, die hier veröffentlicht wurde:
http://blog.frankleonhardt.com/2015/freebsd-hr-utility-human-readable-number-filter-man-page/
Es heißt hr und nimmt stdin (oder Dateien) und konvertiert Zahlen in ein für Menschen lesbares Format, das (jetzt) genau dem von ls -h usw. entspricht. Außerdem kann es einzelne Feeds in Zeilen auswählen und skalieren vorskalierte Einheiten (z. B. wenn sie in 512-Byte-Blöcken sind, konvertieren Sie sie in MB usw.), passen Sie den Spaltenabstand an und so weiter.
Ich habe es vor ein paar Jahren geschrieben, weil ich dachte, ein Shell-Skript zu schreiben, obwohl intellektuell interessant, war auch völliger Wahnsinn.
Wenn Sie beispielsweise hr verwenden, können Sie auf einfache Weise eine sortierte Liste der Verzeichnisgrößen abrufen (die in Einheiten von 1 KB ausgegeben werden und vor der Konvertierung verschoben werden müssen).
du -d1 | sort -n | hr -sK
Während du -h ausgibt, wird sort nicht danach sortiert. Das Hinzufügen von -h zu vorhandenen Dienstprogrammen ist ein klassischer Fall, bei dem die Unix-Philosophie nicht befolgt wird: Einfache Dienstprogramme erledigen definierte Aufgaben wirklich gut.
quelle
Hier ist eine Möglichkeit, es fast nur in Bash zu tun, benötigt nur 'bc' für die Gleitkomma-Mathematik.
Verwendungszweck:
Ausgabe:
quelle
Gibt:
Leider kann ich nicht herausfinden, wie man die Genauigkeit von zwei Dezimalstellen erhält. Getestet auf Ubuntu 14.04.
quelle
@ don_crissti's erste Antwort ist gut, kann aber mit Here Strings noch kürzer sein , z
oder auch
wenn
<<<
nicht verfügbar, können Sie zB verwendenquelle
Es gibt Python-Tools
Ich sehe kein --binary-Flag :(, daher müsstest du Python direkt für die binäre Darstellung verwenden:
quelle
Ich hatte das gleiche Problem und fand schnell eine einfache Lösung mit
awk
derlog()
Funktion:Und die Genauigkeit, die bei der Verwendung von Gleitkommazahlen verloren geht, ist nicht so schlecht, da diese Genauigkeit sowieso verloren geht.
quelle
Die Antwort auf Ihre Frage lautet ja.
Das Ausgabeformat entspricht zwar nicht genau Ihrer Spezifikation, die Konvertierung selbst kann jedoch problemlos mit einem Standardtool (oder zwei) durchgeführt werden . Diejenigen, auf die ich mich beziehe, sind
dc
undbc
. Sie können einen segmentierten Bericht erhalten, indem Sie die Ausgaberadices ändern. So was:... was druckt ...
Ich verwende es
dc
oben, weil es ein persönlicher Favorit ist, aberbc
dasselbe mit unterschiedlicher Syntax tun kann und die gleichen Formatregeln einhält, wie sie von POSIX angegeben wurden, wie:bc
obasebc
Schreiben Sie für Basen von 17 bis 100 zweistellige Dezimalzahlen; Für Basen von 101 bis 1000, dreistellige Dezimalzeichenfolgen usw. Beispielsweise würde die Dezimalzahl 1024 in Basis 25 wie folgt geschrieben:01 15 24
und in der Basis 125 als:
008 024
quelle
Kurz und bündig, nur Muschellösung:
Der Dezimaltrank wird nicht angezeigt.
Das
let VAR=expression
ist Kornisch. ErsetzeVAR=$(( expression ))
Born-again-ish durch.quelle
AFAIK Es gibt kein solches Standardwerkzeug, an das Sie Text übergeben können, und es gibt eine für Menschen lesbare Form zurück. Möglicherweise finden Sie ein Paket, um diese Aufgabe für Ihre Distribution zu erfüllen.
Ich verstehe jedoch nicht, warum Sie ein solches Tool benötigen. Die meisten Pakete, die eine verwandte Ausgabe liefern, haben normalerweise einen Schalter -h oder einen gleichwertigen Schalter für eine lesbare Ausgabe.
quelle