Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3882919
  • 博文数量: 146
  • 博客积分: 3918
  • 博客等级: 少校
  • 技术积分: 8585
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-17 13:52
个人简介

个人微薄: weibo.com/manuscola

文章分类

全部博文(146)

文章存档

2016年(3)

2015年(2)

2014年(5)

2013年(42)

2012年(31)

2011年(58)

2010年(5)

分类: LINUX

2013-07-21 16:55:07

   在学习Effective awk Program。在工作中虽然shell也算是自己的常规武器,但是shell的运用并不纯熟,把书中自己理解不深,或者没注意到的地方记录一下,毕竟每次看英文书有点重点不突出。
   Effective awk Program 第三章Reading Input Files中的Using Regular Expression to Separate Fields中提到了一个很有趣的现象。 
  1. echo " a b c d " | awk '{ print $2 }'
  2. echo " a b c d " awk 'BEGIN {FS="[ \t\n]"} {print $2}'
    这两个的输出是否一致,我学习这一章节之前,认为输出是相同的,都是b。实际上: 
      
   我们看到第一个命令和第二个命令的输出是不一样的。原因在于,默认的情况下,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
阅读(12633) | 评论(2) | 转发(4) |
给主人留下些什么吧!~~

Bean_lee2013-07-30 22:19:36

聆音听墨:以前看sed&awk,现在又忘了,幸好刚刚又温习了一遍。

我是集中学习学习,awk和sed 自己用的并不纯熟,虽说也写过一些shell脚本了,自己总是不满意自己的shell水平。

回复 | 举报

聆音听墨2013-07-30 20:24:45

以前看sed&awk,现在又忘了,幸好刚刚又温习了一遍。