Why I Default to The Old Ways
Thomas H Jones II
Posted on July 19, 2019
I work with a growing team of automation engineers. Most are purely dev types. Those that have lived in the Operations world, at all, skew heavily towards Windows or only had to very lightly deal with UNIX or Linux.
I, on the other hand, have been using UNIX flavors since 1989. My first Linux system was the result of downloading a distribution from the MIT mirrors in 1992. Result, I have a lot of old habits (seriously: some of my habits are older than some of my teammates). And, because I've had to get deep into the weeds with all of those operating systems many, many, many times, over the years, those habits are pretty entrenched ("learned with blood" and all that rot).
A year or so ago, I'd submitted a PR that included some regex-heavy shell scripts. The person that reviewed the PR had asked "why are you using [<SPACE><TAB>]*
in your regexes rather than just \s
?". At the time, I think my response was a semi-glib, "A) old habits die hard; and, B) I know that the former method always works".
That said, I am a lazy-typist. Typing "\s
" is a lot fewer keystrokes than is "[<SPACE><TAB>]*
". Similarly, "\s
" takes up a lot less in the way of column-width than does "[<SPACE><TAB>]*
" (and I/we generally like to code to fairly standard page-widths). So, for both laziness reasons and column-conservation reasons, I started to move more towards using "\s
" and away from using "[<SPACE><TAB>]*
". I think in the last 12 months, I've moved almost exclusively to "\s
".
Today, that move bit me in the ass. Well, yesterday, actually, because that's when I started receiving reports that the tool I'd authored on EL7 wasn't working when installed/used on EL6. Ultimately, I traced the problem to an awk
invocation. Specifically, I had a chunk of code (filtering DNS output) that looked like:
awk '/\sIN SRV\s/{ printf("%s;%s\n",$7,$8)}'
Which worked a treat on EL7 but on EL6, "not so much." When I altered it to the older-style invocation:
awk '/[]\*IN[]\*SRV[]\*/{ printf("%s;%s\n",$7,$8)}'
It worked fine on both EL7 and EL6. Turns out the ancient version of awk
(3.1.7) on EL6 didn't know how to properly interpret the "\s
" token. Oddly (my recollection from writing other tooling) is that EL6's version of grep
understands the "\s
" token just fine.
When I Slacked the person I'd had the original conversation with a link to the PR with a "see: this is why" note, he replied, "oh: I never really used awk, so never ran into it".
Posted on July 19, 2019
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.