X-Git-Url: http://git.shiar.nl/barcat.git/blobdiff_plain/6672fed2b85ccecb6c34aa019b1e87b8d31b8172..b2284fb09db3525ea8a930c98d6fe493e51ca45c:/barcat diff --git a/barcat b/barcat index 3b73b67..753e323 100755 --- a/barcat +++ b/barcat @@ -142,7 +142,6 @@ $opt{'graph-format'} //= '-'; $opt{trim} *= $opt{width} / 100 if $opt{trimpct}; $opt{units} = [split //, ' kMGTPEZYRQqryzafpn'.($opt{ascii} ? 'u' : 'μ').'m'] if $opt{'human-readable'}; -$opt{anchor} //= qr/\A/; $opt{'value-length'} = 4 if $opt{units}; $opt{'value-length'} = 1 if $opt{unmodified}; $opt{'signal-stat'} //= exists $SIG{INFO} ? 'INFO' : 'QUIT'; @@ -206,25 +205,31 @@ if (defined $opt{interval}) { eval { require Tie::Array::Sorted; tie @order, 'Tie::Array::Sorted', sub { $_[1] <=> $_[0] }; - } or warn $@, "Expect slowdown with large datasets!\n"; + } or warn $@, "Expect slowdown with large datasets!\n" + unless $opt{count}; } my $float = qr<[0-9]* [.]? [0-9]+ (?: e[+-]?[0-9]+ )?>; # positive numberish -my $valmatch = qr< $opt{anchor} ( \h* -? $float |) >x; +my $valmatch = $opt{anchor} // qr/\A/; +$valmatch .= !$opt{count} ? qr/( \h* -? $float |)/ : + $opt{anchor} ? qr/(\S*)/ : qr/(.*)/; + while (defined ($_ = $opt{input} ? shift @{ $opt{input} } : readline)) { s/\r?\n\z//; + my $valnum; if ($opt{count}) { - my ($valnum) = m/(\S*)/; - $valnum //= ''; + $valnum = m/$valmatch/ && $1; $uniq{$valnum}++ and next; - push @lines, "\n " . $_; push @values, $valnum; - next; + s/\A/\n /; + } + else { + s/\A\h*// unless $opt{unmodified}; + $valnum = s/$valmatch/\n/ && $1; + push @values, $valnum; + push @order, $valnum if length $valnum; } - s/\A\h*// unless $opt{unmodified}; - my $valnum = s/$valmatch/\n/ && $1; - push @values, $valnum; - push @order, $valnum if length $valnum; + if (defined $opt{trim} and defined $valnum) { my $trimpos = abs $opt{trim}; $trimpos -= length $valnum if $opt{unmodified}; @@ -237,6 +242,8 @@ while (defined ($_ = $opt{input} ? shift @{ $opt{input} } : readline)) { } } push @lines, $_; +} +continue { show_lines() if defined $opt{interval} and $opt{interval} < 0 and $. % $opt{interval} == 0; } @@ -257,7 +264,7 @@ state $nr = $opt{hidemin} ? $opt{hidemin}->($#lines) : 0; my $limit = $opt{hidemax} ? $opt{hidemax}->($#lines, $nr) : $#lines; if ($opt{count}) { - $_ = $uniq{$_} for @values; + $_ = $uniq{$_} for @values[$nr .. $limit]; @order = @values; } @@ -388,6 +395,7 @@ continue { $nr++; } say $opt{palette} ? color(0) : '' if $opt{spark}; +%uniq = () if $opt{interval} and $opt{count}; return $nr; } @@ -501,7 +509,6 @@ Visualizes relative sizes of values read from input Contents are concatenated similar to I, but numbers are reformatted and a bar graph is appended to each line. -Don't worry, barcat does not drink and divide. It can has various options for input and output (re)formatting, but remains limited to one-dimensional charts. For more complex graphing needs @@ -528,9 +535,13 @@ or the I environment variable. =item B<-c>, B<--count> Omit repetitions and count the number of occurrences. -Similar to piping input to C +Similar to piping input through C but keeping the order of first appearances. +Lines are omitted if they (or a specified field) are identical, +and the amount of matches is prepended and used as values +for bars and subsequent statistics. + =item B<-f>, B<--field>=([B<+>]I | I) Compare values after a given number of whitespace separators, @@ -776,7 +787,7 @@ Users on the current server while preserving order: Number of HTTP requests per day: - cat httpd/access.log | cut -d\ -f4 | cut -d: -f1 | uniq -c | barcat + barcat -cf'\[([^:]+)' httpd/access.log Any kind of database query results, preserving returned alignment: