Files
percona-toolkit/bin/pt-rel

176 lines
5.0 KiB
Perl
Executable File

#!/usr/bin/env perl
# This program is part of Percona Toolkit: http://www.percona.com/software/
# See "COPYRIGHT, LICENSE, AND WARRANTY" at the end of this file for legal
# notices and disclaimers.
use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars);
use constant MKDEBUG => $ENV{MKDEBUG};
my $file = shift @ARGV || '-';
my $fh;
if ( $file eq '-' ) {
$fh = *STDIN;
}
else {
open $fh, "<", $file or die "Cannot open $file: $OS_ERROR";
}
my @line_patterns;
my %last_match;
my %printf_for;
while ( my $line = <$fh> ) {
MKDEBUG && print "read: $line\n";
my $matched = 0;
foreach my $pat ( @line_patterns ) {
MKDEBUG && print "trying to match: $pat\n";
if ( my @vals = $line =~ m/$pat/ ) {
MKDEBUG && print "matches\n";
$matched = 1;
my @last_vals = @{ $last_match{$pat} };
my @offset_vals;
for my $i ( 0..$#vals ) {
$offset_vals[$i] = $vals[$i] - $last_vals[$i];
}
$last_match{$pat} = \@vals;
printf $printf_for{$pat}, @offset_vals;
last;
}
}
if ( !$matched ) {
my $new_pat = $line;
$new_pat =~ s/\d+/(\\d+)/g;
my @vals = $line =~ m/$new_pat/;
MKDEBUG && print "new pattern: $new_pat: @vals\n";
push @line_patterns, $new_pat;
(my $printf_pat = $line ) =~ s/\d+/%d/g;
$printf_for{$new_pat} = $printf_pat;
$last_match{$new_pat} = \@vals;
print $line;
}
}
close $fh or warn "Cannot close $file: $OS_ERROR";
exit;
=pod
=head1 NAME
rel - Make each number in a line of text relative to the previous matching line.
=head1 SYNOPSIS
Given a file with some lines of text that follow a repeated pattern, including
numbers,
rel /path/to/file.txt
For example, if the text is this:
Mutex spin waits 0, rounds 99584819933, OS waits 437663963
RW-shared spins 834337527, OS waits 20258150; RW-excl spins 1769749834
Mutex spin waits 0, rounds 99591465498, OS waits 437698122
RW-shared spins 834352175, OS waits 20259032; RW-excl spins 1769762980
The output will be
Mutex spin waits 0, rounds 99584819933, OS waits 437663963
RW-shared spins 834337527, OS waits 20258150; RW-excl spins 1769749834
Mutex spin waits 0, rounds 6645565, OS waits 34159
RW-shared spins 14648, OS waits 882; RW-excl spins 13146
=head1 DOWNLOADING
Visit L<http://www.percona.com/software/> to download the latest release of
Percona Toolkit. Or, to get the latest release from the command line:
wget percona.com/latest/percona-toolkit/PKG
Replace C<PKG> with C<tar>, C<rpm>, or C<deb> to download the package in that
format. You can also get individual tools from the latest release:
wget percona.com/latest/percona-toolkit/TOOL
Replace C<TOOL> with the name of any tool.
=head1 ENVIRONMENT
The environment variable C<PTDEBUG> enables verbose debugging output to STDERR.
To enable debugging and capture all output to a file, run the tool like:
PTDEBUG=1 $TOOL ... > FILE 2>&1
Be careful: debugging output is voluminous and can generate several megabytes
of output.
=head1 SYSTEM REQUIREMENTS
You need Bash.
=head1 BUGS
For a list of known bugs, see L<http://www.percona.com/bugs/$TOOL>.
Please report bugs at L<https://bugs.launchpad.net/percona-toolkit>.
Include the following information in your bug report:
=over
=item * Complete command-line used to run the tool
=item * Tool L<"--version">
=item * MySQL version of all servers involved
=item * Output from the tool including STDERR
=item * Input files (log/dump/config files, etc.)
=back
If possible, include debugging output by running the tool with C<PTDEBUG>;
see L<"ENVIRONMENT">.
=head1 AUTHORS
Baron Schwartz
=head1 ABOUT PERCONA TOOLKIT
This tool is part of Percona Toolkit, a collection of advanced command-line
tools developed by Percona for MySQL support and consulting. Percona Toolkit
was forked from two projects in June, 2011: Maatkit and Aspersa. Those
projects were created by Baron Schwartz and developed primarily by him and
Daniel Nichter, both of whom are employed by Percona. Visit
L<http://www.percona.com/software/> for more software developed by Percona.
=head1 COPYRIGHT, LICENSE, AND WARRANTY
This program is copyright 2010 Baron Schwartz, 2011 Percona Inc.
Feedback and improvements are welcome.
THIS PROGRAM IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, version 2; OR the Perl Artistic License. On UNIX and similar
systems, you can issue `man perlgpl' or `man perlartistic' to read these
licenses.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA.
=head1 VERSION
Percona Toolkit v1.0.0 released 2011-08-01
=cut