#!/usr/bin/perl #author: Chris Sincock #This software is provided as-is and is not guaranteed to be free of defects. Use it only at your own risk. #turns numbers in the standard input stream into #human readable numbers with K,M,G units etc use strict; my $false = 0; my $true = 1; my $dec = $false; my $singleval = undef; my $both = $false; my $bin = $false; my $format = ""; my $stream = $true; my $preserve = $false; for my $arg (@ARGV) { if($arg =~ /^-d(ec|)$/i) { $dec=$true; } elsif($arg =~ /^-b(in|)$/i) { $bin=$true; } # elsif($arg =~ /^-s(tream|)$/i) # { # $stream=$true; # } elsif($arg =~ /^[+](.*)$/) { $format=$1; } elsif($arg =~ /^-both$/i) { $both=$true; } elsif($arg =~ /^-preserve$/i) { $preserve=$true; } elsif($arg =~ /^\d+$/) { $singleval=$arg; $stream=$false; } } if(!($both || $bin || $dec)) { $bin=$true; } if(!$stream) { die "No number supplied!" if !defined($singleval); } my %dec=(k=>1000,m=>1000000,g=>1000000000); my %bin=(k=>1024,m=>1048576,g=>1073741824); sub valstr() { my $val=shift; my $type=shift; my %bases=$type eq "dec" ? %dec : %bin; my $k = $val/$bases{'k'}; my $m = $val/$bases{'m'}; my $g = $val/$bases{'g'}; my $base= $g >= 1.0 ? "g" : ($m >= 1.0 ? "m" : ($k >= 1.0 ? "k" : "")); my $h = "${val}B"; if($base eq "k") { $h=int($k) ."K"; } elsif($base eq "m") { $h=sprintf("%1.1fM",$m); } elsif($base eq "g") { $h=sprintf("%2.2fG",$g); } return $h; } sub valtostr() { my $val=shift; my $dval=&valstr($val,"dec"); my $bval=&valstr($val,"bin"); if($format) { $format =~ s/%b/$bval/i; $format =~ s/%d/$dval/i; return $format; } elsif($both) { return "$bval ($dval)"; } else { return ($dec ? $dval : $bval); } } if($singleval) { print STDOUT &valtostr($singleval)."\n"; } else { # print STDERR "humanifying stream:\n"; for my $line() { my $str=""; my $matches=0; my $w=0; chomp $line; while($line =~ /^(.*?\s|)(\d+)(\s.*|)$/) { #print STDERR "matched:$1,$2,$3\n"; my $before=$1; $w=length($2); # print STDERR "num is $2, length is $2\n"; my $v = &valtostr($2); $str .= $before; if($preserve) { $w -= length($v); if($w > 0) { # print STDERR "padding with $w spaces\n"; $str .= " " x $w; } } $str .= $v; $line = $3; $matches++; } print STDOUT $str . $line . "\n"; } }