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