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:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 .... |
Very nice, thanks!
Thanks for sharing.
Besides forcing the spacing with the printf, this looks the same as: egrep -v ‘^$|^#’ /etc/my.cnf
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.
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
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)
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
for pretty output with colors, you can use this python script: http://www.linibou.com/colorex/ also useful for logs.
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
Should have said:
alias printmycnf=[insert perl one-liner]
@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
@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.
Appears that WordPress is messing up the quotes for us, as my post is exhibiting the same quoting issue.
@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
I tried that, but it just hung.
@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.
Thanks, I got it working now. I don’t think I was including the filename before.