#!/bin/sh # This program is part of Aspersa (http://code.google.com/p/aspersa/) # Author: Baron Schwartz usage() { echo "Usage: $0 [-r] -- commandline" echo " -r Relative: subtract each column from the previous column." echo " -- Option separator; after this, all arguments are passed" echo " to the program whose output mext will columnize." echo "mext columnizes repeated output from a program like mysqladmin extended:" echo " mext -r -- mysqladmin ext -i10 -c3" echo "You can also work with data from a file:" echo " mext -r -- cat mysqladmin-output.txt" exit 1 } if [ -z "$1" ]; then usage; fi FILE=/tmp/mext_temp_file; NUM=0; REL=0; rm -f $FILE*; # Command-line parsing. args=`getopt -u -n mext r "$@"`; if [ "$?" = "1" ]; then usage; fi set -- $args for o; do case "$o" in -r) REL="1"; shift;; --) shift; break;; esac done if [ -z "$1" ]; then usage; fi # Split the output on empty lines and put each into a different file; eliminate # lines that don't have "real" content. $@ | grep -v '+' | grep -v Variable_name | sed 's/|//g' \ | while read line; do if [ "$line" = "" ]; then NUM=`expr $NUM + 1`; echo "" > $FILE$NUM; fi echo "$line" >> $FILE$NUM; done # Count how many files there are and prepare to format the output SPEC="%-33s %13d" AWKS="" NUM=`ls $FILE* | wc -l`; # The last file will be empty... NUM=`expr $NUM - 3`; # Join each file with the next file, joining on the first field. Build a printf # spec and awk spec at the same time. for i in `seq 0 $NUM`; do NEXTFILE=`expr $i + 1`; # Sort each file and eliminate empty lines, so 'join' doesn't complain. sort $FILE$i | grep . > $FILE$i.tmp; mv $FILE$i.tmp $FILE$i; sort $FILE${NEXTFILE} | grep . > $FILE${NEXTFILE}.tmp; mv $FILE${NEXTFILE}.tmp $FILE${NEXTFILE}; # Join the files together. This gets slow O(n^2) as we add more files, but # this really shouldn't be performance critical. join $FILE$i $FILE${NEXTFILE} | grep . > $FILE; # Find the max length of the [numeric only] values in the file so we know how # wide to make the columns MAXLEN=`awk '{print $2}' $FILE${NEXTFILE} | grep -v '[^0-9]' | awk '{print length($1)}' | sort -rn | head -n1` mv $FILE $FILE${NEXTFILE}; SPEC="$SPEC %${MAXLEN}d"; if [ "$REL" = "1" ]; then AWKS="$AWKS, \$`expr $i + 3` - \$`expr $i + 2`"; else AWKS="$AWKS, \$`expr $i + 3`"; fi done # Print output AWKCMD="printf(\"$SPEC\n\", \$1, \$2$AWKS);"; awk "{$AWKCMD}" $FILE`expr $NUM + 1`; # Remove all temporary files. rm -f $FILE*;