Effective awk Program 第三章Reading Input Files中的Using Regular Expression to Separate Fields中提到了一个很有趣的现象。
-
echo " a b c d " | awk '{ print $2 }'
- echo " a b c d " | awk 'BEGIN {FS="[ \t\n]"} {print $2}'

我们看到第一个命令和第二个命令的输出是不一样的。原因在于,默认的情况下,FS是空格,这种情况下,处理之前,首先会将strip掉头部的空格和tab,以及尾部的空格和tab,但是如果FS修改成[ \t\n]这种形式,就不会strip掉头部和尾部的空白字符,那么,如果头部有1个空格,我们看到$1是null或者empty。
另一个比较有意思的现象是,如果record重新组建,会导致头部和尾部的空白字符strip掉。

我们看到,仅仅是执行了$2=$2这个看起来毫无意义的操作,头部的空格就被strip掉了,事实上尾部的2个空格也被strip掉了。因为赋值操作引发了字符串的rebuild,而rebuild的过程要查找$1,$2...$NF,链接起来,查找$1的过程等同与FS=“ ”的时候的$1,空白字符(空格和tab)会被忽略掉,所以,concatenated string 也就没有头部和尾部的空白字符了。
参考文献:
1 effective awk program