Files
percona-toolkit/bin/pt-align

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';
# Finds the max element in the list
sub max {
my $i = shift @_;
foreach my $n ( @_ ) {
$i = $n if $n > $i;
}
return $i;
}
# Read all lines
my @lines;
my %word_count;
while ( <> ) {
my $line = $_;
my @words = $line =~ m/(\S+)/g;
push @lines, \@words;
$word_count{ scalar @words }++;
}
# Find max number of words per line
my @wc = reverse sort { $word_count{$a}<=>$word_count{$b} } keys %word_count;
my $m_words = $wc[0];
# Filter out non-conformists
@lines = grep { scalar @$_ == $m_words } @lines;
die "I need at least 2 lines" unless @lines > 1;
# Find the widths and alignments of each column
my @fmt;
foreach my $i ( 0 .. $m_words-1 ) {
my $m_len = max(map { length($_->[$i]) } @lines);
my $code = $lines[1]->[$i] =~ m/[^0-9.-]/ ? "%-${m_len}s" : "%${m_len}s";
push @fmt, $code;
}
my $fmt = join(' ', @fmt) . "\n";
# Print!
foreach my $l ( @lines ) {
printf $fmt, @$l;
}
exit 0;
# ############################################################################
# Documentation
# ############################################################################
=pod
=head1 NAME
pt-align - Read lines and split them into words.
=head1 SYNOPSIS
Usage: pt-align [FILES]
pt-align reads lines in files and splits them into words. This is useful for
things like aligning the output of vmstat or iostat so it is easier to read.
=head1 DESCRIPTION
pt-align counts how many words each line has, and if there is one number that
predominates, it assumes this is the number of words in each line. Then it
discards all lines that don't have that many words, and looks at the 2nd line
that does. It assumes this is the first non-header line. Based on whether
each word looks numeric or not, it decides on column alignment. Finally, it
goes through and decides how wide each column should be, and then prints them
out.
The tool's behavior has some important consequences. Reading the entire input
before formatting means that you can't use it for aligning data as it is
generated incrementally, and you probably don't want to use this tool on very
large files. Discarding lines with the wrong number of words means that some
lines won't be printed.
=head1 OPTIONS
This tool does not have any command-line options.
=head1 ENVIRONMENT
This tool does not use any environment variables.
=head1 SYSTEM REQUIREMENTS
This tool requires Perl v5.8 or newer built with core modules.
=head1 BUGS
For a list of known bugs, see L<http://www.percona.com/bugs/pt-align>.
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 DOWNLOADING
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
latest release of Percona Toolkit. Or, get the latest release from the
command line:
wget percona.com/get/percona-toolkit.tar.gz
wget percona.com/get/percona-toolkit.rpm
wget percona.com/get/percona-toolkit.deb
You can also get individual tools from the latest release:
wget percona.com/get/TOOL
Replace C<TOOL> with the name of any tool.
=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