awk 的思考

linux shell 有一个比较复杂的命令:awk  。下面是我对该命令的理解和做的一些思考。
首先awk 的模式为: # awk -option  parameter  ' command '  fileName
其中commmand 的格式为:模式+动作行为。
其中option 用的最多的恐怕是:-F ,也就是指定分隔符。现在我们假设使用默认分隔符----空格。
 
有如下文件 aa.txt
001       alias         20           $11,000
002       blex          21            $12,000
003       clets        22            $30,000
004       darker     23           $52,000
该文件分为4个域,分别为:序号,姓名,年龄,银行存款。
看如下命令 # awk  '/alias/{print $0}'  aa.txt
在command 部分,我们很容易区分 /alias/ 为模式部分 {print $0} 为动作行为部分。
输出结果为:
001       alias         20           $11,000
看这个命令: # awk  '{print $0}'  aa.txt
在command部分,我们看到了动作行为部分{print $0} 但没有看到模式部分,命令执行的结果呢:
001       alias         20           $11,000
002       blex          21            $12,000
003       clets        22            $30,000
004       darker     23           $52,000
证明,没有模式部分,相当于,模式部分为:真。
再看 # awk  '/^00/'   aa.txt
在command部分,我们看到了模式部分:行首匹配00, 但没有看到动作部分,命令执行的结果呢:
001       alias         20           $11,000
002       blex          21            $12,000
003       clets        22            $30,000
004       darker     23           $52,000
OK,还是整个文件,证明没有动作行为部分,则默认输出$0(整行)。
再看 # awk  '1'   aa.txt
模式直接写了个“1”,动作,按照我们上面的结论是默认输出$0,结果如下
001       alias         20           $11,000
002       blex          21            $12,000
003       clets        22            $30,000
004       darker     23           $52,000
原来“1”被解释为:模式为真。
再看 # awk  '0'   aa.txt
模式直接写了个“0”,动作,按照我们上面的结论是默认输出$0,结果为空,什么都没输出,
原来“0”被解释为:模式为假。
再看 # awk  'aaa'   aa.txt
模式直接写了个“aaa”,动作,按照我们上面的结论是默认输出$0,结果为空,什么都没输出,
原来“aaa”被解释为:模式为假。
还可以试出 :0111为真,1aaaa,为真,000aaa为假。
可以得到结论模式不一定是,某个匹配,或者是某个逻辑表达式,还可以是数字或字符,如果,数字大于0,则模式为真否则为假,对于数字和字符的混合,则比较复杂,不过想来,谁都不会那么无聊,用字符和数字的混合来表示模式,呵呵。
再看一个:#awk ' /^001/{print $1,$2}{print $0}'    aa.txt 输出的结果为:
001       alias         
001       alias         20           $11,000
002       blex          21            $12,000
003       clets        22            $30,000
004       darker     23           $52,000
哦,看来“行首匹配001”这个没对后面的{print $0}起作用啊!
原来是,一个模式对应一个动作,后面那个动作没有模式,也就采用了我们上面所说的默认模式,对每条记录都执行了啊。
下面看两个变量:NR,NF
NR 为 NUMBER OF RECORD 存储记录数目
NF 为 NUMBER OF  FIELD      存储域数目
看个例子 #awk  ''BEGIN{print $0,NR,NF}{print NR,NF }END{print NR,NF}'可以得到的结果为:
00
14
24
34
44
可以看到读取一条记录,其实NR和NF都在变化。
归纳出 awk的执行过程:处理BEGIN,然后,读取一条记录,更新NR的值,更新$0,将$0分域,更新NF的值,更新$1......$n,然后处理commmand 的内容,最后处理END。
分享至
一键收藏,随时查看,分享好友!
0人
了这篇文章
类别: linux┆阅读( 0)┆评论( 0) ┆ 返回博主首页┆ 返回博客首页
上一篇 工作日志2007.01.04 下一篇 preceding轴的使用实例

职位推荐

  • JAVA开发工程师
  • 高级Java想挣钱的看看
  • Java工程师
  • .NET软件工程师(B/S方向)
  • 手机游戏unity3D、C++、C#客户端
  • Java工程师
  • 前端工程师
  • SFDC engineer
  • C#高级工程师
  • Java工程师

文章评论

 
[1楼]        徒步天下  回复
2007-03-13 14:30:39
正在写AWK的东西,先学习一下。

[2楼]       [匿名]51CTO游客  回复
2007-05-29 13:53:05
写的很不错

 

发表评论            

昵  称:
登录  快速注册
验证码:

点击图片可刷新验证码请点击后输入验证码博客过2级,无需填写验证码

内  容:

同时赞一个

每日博报 精彩不止一点关闭

你可能感兴趣的:(职场,休闲)