X-Git-Url: http://git.shiar.nl/barcat.git/blobdiff_plain/e8e86ee4ef87d10f2ec46c09f2c7ccd51adb0cb2..0efc8a341754dc7b8629008d0e7dbcba46d31af5:/barcat diff --git a/barcat b/barcat index 9c4741a..5863c4c 100755 --- a/barcat +++ b/barcat @@ -77,7 +77,10 @@ if (defined $opt{interval}) { } or warn $@, "Expect slowdown with large datasets!\n"; } -$SIG{INT} = 'IGNORE'; # continue after assumed eof +$SIG{INT} = sub { + $SIG{INT} = 'DEFAULT'; # reset for subsequent attempts + 'IGNORE' # continue after assumed eof +}; my $valmatch = qr/$opt{anchor} ( \h* -? [0-9]* \.? [0-9]+ (?: e[+-]?[0-9]+ )? |)/x; while (readline) { @@ -99,6 +102,12 @@ while (readline) { $SIG{INT} = 'DEFAULT'; +sub color { + $opt{color} and defined $_[0] or return ''; + return "\e[$_[0]m" if defined wantarray; + $_ = color(@_) . $_ . color(0) if defined; +} + sub show_lines { state $nr = $opt{hidemin} ? $opt{hidemin} - 1 : 0; @@ -124,18 +133,18 @@ if ($opt{markers} // 1 and $size > 0) { $barmark[ orderpos($#order * .68269) ] = '<'; $barmark[ orderpos($#order / 2) ] = '+'; # mean $barmark[ -$minval * $size ] = '|' if $minval < 0; # zero - defined and $opt{color} and $_ = "\e[36m$_\e[0m" for @barmark; + color(36) for @barmark; state $lastmax = $maxval; if ($maxval > $lastmax) { print ' ' x ($lenval + $len); - printf "\e[90m" if $opt{color}; + printf color(90); printf '%-*s', ($lastmax - $minval) * $size + .5, '-' x (($values[$nr - 1] - $minval) * $size); - print "\e[92m" if $opt{color}; + print color(92); say '+' x (($maxval - $lastmax - $minval) * $size + .5); - print "\e[0m" if $opt{color}; + print color(0); $lastmax = $maxval; } } @@ -143,13 +152,12 @@ if ($opt{markers} // 1 and $size > 0) { @lines > $nr or return if $opt{hidemin}; sub sival { - my $unit = int(log($_[0]) / log(1000) - ($_[0] < 1)); - my $float = $_[0] !~ /^ (?: 0*\.)? [0-9]{1,3} $/x; - sprintf('%*.*f%*s', - $float ? 5 : 3, $float, # length and tenths - $_[0] / 1000 ** $unit, # number - $float ? 0 : 3, # unit size - $#{$opt{units}} >> 1 < abs $unit ? "e$unit" : $opt{units}->[$unit] + my $unit = int(log(abs $_[0] || 1) / log(10) - 3*($_[0] < 1) + 1e-15); + my $float = $_[0] !~ /^0*[-0-9]{1,3}$/; + sprintf('%3.*f%1s', + $float && ($unit % 3) == ($unit < 0), # tenths + $_[0] / 1000 ** int($unit/3), # number + $#{$opt{units}} * 1.5 < abs $unit ? "e$unit" : $opt{units}->[$unit/3] ); } @@ -157,12 +165,12 @@ while ($nr <= $#lines) { $nr >= $opt{hidemax} and last if defined $opt{hidemax}; my $val = $values[$nr]; if (length $val) { - my $color = !$opt{color} ? 0 : + my $color = !$opt{color} ? undef : $val == $order[0] ? 32 : # max $val == $order[-1] ? 31 : # min 90; $val = $opt{units} ? sival($val) : sprintf "%*s", $lenval, $val; - $val = "\e[${color}m$val\e[0m" if $color; + color($color) for $val; } my $line = $lines[$nr] =~ s/\n/$val/r; printf '%-*s', $len + length($val), $line; @@ -192,6 +200,7 @@ if ($opt{stat}) { } __END__ +=encoding utf8 =head1 NAME @@ -315,15 +324,15 @@ Draw a sine wave: seq 30 | awk '{print sin($1/10)}' | barcat -Compare file sizes: +Compare file sizes (with human-readable numbers): - du -d0 -m * | barcat + du -d0 -b * | barcat -H -Memory usage of user processes: +Memory usage of user processes with long names truncated: ps xo %mem,pid,cmd | barcat -l40 -Monitor network latency: +Monitor network latency from prefixed results: ping google.com | barcat -f'time=\K' -t @@ -334,22 +343,30 @@ Commonly used after counting, for example users on the current server: Letter frequencies in text files: cat /usr/share/games/fortunes/*.u8 | - perl -CO -nE 'say for grep length, split /\PL*/, uc' | + perl -CS -nE 'say for grep length, split /\PL*/, uc' | sort | uniq -c | barcat Number of HTTP requests per day: cat log/access.log | cut -d\ -f4 | cut -d: -f1 | uniq -c | barcat -Any kind of database query with leading counts: +Any kind of database query with counts, preserving returned alignment: echo 'SELECT count(*),schemaname FROM pg_tables GROUP BY 2' | psql -t | barcat -u +Earthquakes worldwide magnitude 1+ in the last 24 hours: + + https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/1.0_day.csv | + column -tns, | graph -f4 -u -l80% + External datasets, like movies per year: curl https://github.com/prust/wikipedia-movie-data/raw/master/movies.json | - jq '.[].year' | uniq -c | barcat + perl -054 -nlE 'say if s/^"year"://' | uniq -c | barcat + +But please get I to process JSON +and replace the manual selection by C<< jq '.[].year' >>. Pokémon height comparison: @@ -377,6 +394,12 @@ Or the top 3 most frequent authors with statistics over all: git shortlog -sn | barcat -L3 -s +Activity of the last days (substitute date C<-v-{}d> on BSD): + + ( git log --pretty=%ci --since=30day | cut -b-10 + seq 0 30 | xargs -i date +%F -d-{}day ) | + sort | uniq -c | awk '$1--' | graph + =head1 AUTHOR Mischa POSLAWSKY