February 8, 2012

How to pretty-print my.cnf with a one-liner

When I’m looking at a server, I often want to see the /etc/my.cnf file nicely formatted, and with comments stripped. This Perl one-liner will pretty-print the file:

perl -ne 'm/^([^#][^\s=]+)\s*(=.*|)/ && printf("%-35s%s\n", $1, $2)' /etc/my.cnf
[client]
port                               = 3306
socket                             = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket                             = /var/run/mysqld/mysqld.sock
nice                               = 0
[mysqld]
user                               = mysql
pid-file                           = /var/run/mysqld/mysqld.pid
socket                             = /var/run/mysqld/mysqld.sock
port                               = 3306
....
About Baron Schwartz

Baron joined Percona in April 2008. As Chief Performance Architect, he consults with customers as well as developing tools and practices for Percona's team. He is the lead author of High Performance MySQL, 2nd Edition.

Comments

  1. Very nice, thanks!

  2. deminy says:

    Thanks for sharing.

  3. Besides forcing the spacing with the printf, this looks the same as: egrep -v ‘^$|^#’ /etc/my.cnf

  4. Nice, i like awk so i give you mine with sections separated by a line:
    awk ‘! /^#/ && ! /^$/ {if($1 ~ /^\[/ ){gsub(“\[“,”\n[“,$1) };printf(“%-35s%s %s\n”,$1, $2, $3)}’ /etc/my.cnf

    cheers.

  5. Jacob Sohn says:

    shorter version – :)
    awk ‘! /(^#|^$)/ {printf “%-34s %s %s\n”, $1, $2, $3}’ /etc/my.cnf

    if you don’t care about pretty formats – :)
    grep -Ev ‘(^#|^$)’ /etc/my.cnf

    -jacob

  6. The awk versions work well as long as there’s whitespace, but they won’t pretty-print

    port=3306

    I like awk too, but I’m so clumsy with it that I’m not sure what to do to fix that!

    (PS: the Perl version doesn’t pretty-print things without whitespace perfectly either, but it’s pretty enough for me)

  7. Jacob Sohn says:

    using field separator option and if condition, with or without white space shows pretty format – :)

    awk -F= ‘! /(^#|^$)/ { if ($2 != “”) printf “%-34s = %s\n”, $1,$2; else printf “%s\n”, $1 }’ /etc/my.cnf

    I admit, this is longer than i want it to be…

    -jacob

  8. for pretty output with colors, you can use this python script: http://www.linibou.com/colorex/ also useful for logs.

  9. Seth says:

    Any hints on how to get this to work as a bash alias?

    I would like to add something like this to my .bashrc:

    alias printmycnf=

    but no amount of quote hacking is getting it to work.

    Or has someone refactored it has a perl script? I think I could do that, but my first attempt was taking longer than 5 minutes so I thought I would ask.

    Thanks

  10. Seth says:

    Should have said:

    alias printmycnf=[insert perl one-liner]

  11. Jacob Sohn says:

    @Seth
    knowning where to escape, you should be able to do as this;

    alias printmycnf=’awk -F= “! /(^#|^$)/ { if (\$2 != \”\”) printf \”%-34s = %s\n\”, \$1,\$2; else printf \”%s\n\”, \$1 }”‘

    you can replace with perl one-liner where awk is.

    -jacob

  12. Seth says:

    @Jacob – Not sure what’s going on here… but the quoting is messed up. Appears to be the MS-SmartQuotes / unicode issue. Some of the double-quotes above are leaning one direction and some are leaning the other way. When I paste it as is into my terminal I get:

    alias printmycnf=.awk -F= .! /(^#|^$)/ { if (\$2 != \.\.) printf \.%-34s = %s\n\., \$1,\$2; else printf \.%s\n\., \$1 }..

    Did you copy and paste from somewhere weird, like a word document or something? I tried to modify it back to what it should be:

    alias printmycnf=’awk -F= “! /(^#|^$)/ { if (\$2 != \”\”) printf \”%-34s = %s\n\”, \$1,\$2; else printf \”%s\n\”, \$1 }”‘

    But when I ran it (RHEL 4.8) it just hung. I’ve tried inserting the perl string as an alias and doing various things to escape the quotes w/l much luck.

    I guess I could just put the command into a shell script for now.

  13. Seth says:

    Appears that WordPress is messing up the quotes for us, as my post is exhibiting the same quoting issue.

  14. Jacob Sohn says:

    @Seth

    Yeah, the “,’,` characters gets altered from ISO-8859-1 to UTF-8 probably. Copy and paste the code and just replace those characters with proper ones. Then all should work fine.

    -jacob

  15. Seth says:

    I tried that, but it just hung.

  16. Jacob Sohn says:

    @Seth

    have you tried “printmycnf /etc/my.cnf” after alias command?

    On my system;
    $ alias printmycnf=’awk -F= “! /(^#|^$)/ { if (\$2 != \”\”) printf \”%-34s = %s\n\”, \$1,\$2; else printf \”%s\n\”, \$1 }”‘
    $ printmycnf /etc/my.cnf

    works like a charm.

    ps: don’t forget to replace single quote and double quote. better yet, just type it in manually.

  17. Seth says:

    Thanks, I got it working now. I don’t think I was including the filename before.

Speak Your Mind

*