App-Tailor
view release on metacpan or search on metacpan
lib/App/Tailor.pm view on Meta::CPAN
my ($regex, $replace) = @rule;
if ($line =~ /$regex/) {
if (ref $replace eq 'CODE') {
$line =~ s/$regex/
local $_ = $line;
$replace->($line);
/xe;
}
else {
eval "\$line =~ s/$regex/$replace/";
}
}
}
elsif ($type == COLORIZE) {
my ($regex, $color) = @rule;
$line =~ s/($regex)/$color$1$RESET/;
}
return $line;
}
sub ignore ($) {
my ($regex) = @_;
push @RULES, [IGNORE, $regex];
}
sub modify ($$) {
my ($regex, $replacement) = @_;
push @RULES, [MODIFY, $regex, $replacement];
}
sub colorize ($@) {
my ($regex, @colors) = @_;
my $color = color @colors;
push @RULES, [COLORIZE, $regex, $color];
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
App::Tailor - easily tailor terminal output to meet your needs
=head1 VERSION
version 0.02
=head1 SYNOPSIS
#-------------------------------------------------------------------------------
# file: my-filter.pl
#-------------------------------------------------------------------------------
use App::Tailor;
use JSON::XS qw(decode_json);
# ignore lines containing /ping
ignore qr/\/ping/;
# parse JSON-encoded lines
modify qr/^{/ => sub{
my $data = decode_json $_;
my $msg = $data->{message};
my $ts = $data->{timestamp};
my $pri = $data->{priority};
return "[$ts] [$pri] $msg";
};
# make error lines white on red
colorize qr/\[ERROR\]/ => qw(white on_red);
# tail STDIN
tail;
#-------------------------------------------------------------------------------
# using your filter
#-------------------------------------------------------------------------------
$ tail /var/log/some-log-file | my-filter.pl
=head1 DESCRIPTION
There are a number of programs available to filter, colorize, and modify
streaming output. Generating exactly the desired output often requires
pipe-chaining many calls to grep, cut, cols, jq, et al, or using an inflexible
config file or files, often in tandem with a long chain of piped commands.
C<App::Tailor> makes it easier to do this by making it trivial to write quick
scripts to filter, alter, and colorize output exactly as needed.
=head1 EXPORTS
=head2 ignore
Accepts a regex which, when matched, will cause a line of input to be ignored.
ignore qr/foo/; # ignore any line containing 'foo'
ignore qr/foo(?=bar) # ignore any line containing 'foo' followed by 'bar'
Ignored rules are applied to each line of input B<FIRST>.
=head2 modify
Accepts a regex which, when matched, will cause a the first capture in the
input to by modified. If the second argument is a string, it will replace the
first capture in the matching regex. If the second argument is a function, it
will be called on the first capture's matching text and its return value will
replace the captured text in the line's output. For convenience, C<$_> is
assigned to the value of the captured text.
If multiple matching rules exist, they are applied in the order in which they
were defined.
modify qr/foo/ => sub{ uc $_ }; # foo => FOO
modify qr/FOO/ => 'FOOL'; # FOO => 'FOOL';
( run in 1.428 second using v1.01-cache-2.11-cpan-6aa56a78535 )