4 use List::Util qw( max sum );
5 use open qw( :std :utf8 );
9 use Getopt::Long '2.33';
10 sub podexit { require Pod::Usage; Pod::Usage::pod2usage(-exitval => 0, @_) }
14 'usage|h' => sub { podexit() },
15 'help' => sub { podexit(-verbose => 2) },
16 ) or exit 64; # EX_USAGE
17 $opt{width} ||= $ENV{COLUMNS} || 80;
20 my @lines = readline or exit;
22 my @values = map { s/^\h* ( -? [0-9]* (?:\.[0-9]+)? )//x and $1 } @lines;
23 my @order = sort { $b <=> $a } grep { length } @values;
24 my $maxval = max $order[0], -$order[-1];
25 my $lenval = max map { length } @order;
26 my $len = 1 + max map { length } @lines; # left padding
27 my $size = $maxval && ($opt{width} - $lenval - $len) / $maxval; # bar multiplication
29 sub orderpos { ($order[$_[0]] + $order[$_[0] + .5]) / 2 * $size }
31 $barmark[ sum(@order) / @order * $size ] = '='; # average
32 $barmark[ orderpos($#order / 2) ] = '+'; # mean
33 defined and $opt{color} and $_ = "\e[36m$_\e[0m" for @barmark;
35 for my $nr (0 .. $#lines) {
36 my $val = $values[$nr];
38 my $color = !$opt{color} ? 0 :
39 $val == $order[0] ? 32 : # max
40 $val == $order[-1] ? 31 : # min
42 printf "\e[%sm", $color if $color;
43 printf "%*s", $lenval, $val;
44 print "\e[0m" if $color;
46 printf '%-*s', $len, $lines[$nr];
47 print $barmark[$_] // '-' for 1 .. abs($val || 0) * $size;
55 graph - append bar chart to input numbers
59 B<graph> [<options>] [<input>]
63 Each line starting with a number is given a bar to visualise relative sizes.
71 Disable colored output of values and bar markers.
73 =item -w, --width=<columns>
75 Override the maximum number of columns to use.
76 Appended graphics will extend to fill up the entire screen.
82 Commonly used after counting, such as users on the current server:
84 users | sed 's/ /\n/g' | sort | uniq -c | graph
86 Letter frequencies in text files:
88 cat /usr/share/games/fortunes/*.u8 |
89 perl -CO -nE 'say for grep length, split /\PL*/, uc' |
90 sort | uniq -c | graph
92 Memory usage of user processes:
94 ps xo %mem,pid,cmd | graph -l40
96 Sizes (in megabytes) of all root files and directories:
100 Number of HTTP requests per day:
102 cat log/access.log | cut -d\ -f4 | cut -d: -f1 | uniq -c | graph
104 Any kind of database query with leading counts:
106 echo 'SELECT count(*),schemaname FROM pg_tables GROUP BY 2' |
109 Git statistics, such commit count by year:
111 git log --pretty=%ci | cut -b-4 | uniq -c | graph
113 Or the most frequent authors:
115 git shortlog -sn | graph | head -3
119 Mischa POSLAWSKY <perl@shiar.org>