awk琐记(一)概念

  这几天在学习sed、awk这两个命令,个人感觉这两个命令的工作模式都是一致的,在学习过程中可以对比学习,这样效果会好些。但是,awk相对sed要复杂很多,所幸,我是先学习的sed,现在学习awk,感觉容易入门一些。建议先学习sed,而后学习awk。

  由于awk包含的东西比较多,我现在没有能力言简意赅的把它总结出来。但是,我学习东西时总是想首先掌握“框架”,然后,再去学习细枝末叶的东西。这有好处也有坏处。好处是一旦掌握它,能够灵活变通;缺点是需要较长的时间来学习,可以说是学院派的。

  本人文笔不好,能少写一个字,绝不多写一个!大家见谅,下面主要介绍awk的概念、命令格式等。

  • 1. awk简介

  awk是三位作者(Drs. A. Aho、P. Weinberger 和 B. Kernighan)名字首字母的组合,本身没有什么意义。它是一种文本处理和模式匹配的语言,在处理“报表”类型的本文时尤其方便。

  • 2. awk中几个概念
    2.1 记录(record)

  awk将文本看作一条接一条的record。awk运行时,取出一条record进行处理,处理完成后,取出下一条record处理,直至文件结束。所以,record是什么呢,就是一条记录,是awk处理的基本单元。

  那什么才是一条记录呢?awk中定义了一个变量RS(record-separator),RS将文件内容分割成了一条一条的record。默认FS的值是回车,因此,默认情况下,文件的一行就是一条record。

  2.2 字段(field)

  record由field组成,和record一样,awk也使用一个变量FS(field-sparator)来界定field。默认FS值为任意数量的空白字符(任意数量的连续的空白符),也就是说空格和表符。

总结如下(awk视窗下):

  a。文件是由record与RS组成的;

  b。record由field与FS组成的。

  • 3. awk运行机制

  awk运行过程:从文件中取出第一条record,按照制定的流程进行处理,完成后再从文件中取出第二条记录,重复处理过程。。如此重复,直到处理完所有的记录。

  更详细的流程如下:

    a。利用RS分割符从文件中读取一条record;

    b。利用FS分割符将record分割为几个field;

    c。进行处理;

    d。重复步骤a-c。

  那在程序运行过程中,awk怎么索引这些record或field呢?awk是这样处理的:

    a。$0 表示这个record;

    b。$1, $2, $3 。。。分别表示第一个、第二个、。。。第N个field。

  • 4. awk命令格式
  awk  [-options]  'scripts'  files

  其中scripts 是由一些列的“模式-动作”(pattern-action)单元组成的,具体定义形式为:pattern{action},其中,pattern定义执行该action需要满足的条件,action定义动作。

  在所有的pattern中,awk定义了两个比较特殊的pattern:BEGIN与END,BEGIN { action}表示在处理所有的记录之前需要执行的action,END{action}表示在处理完所有的记录后需要执行的动作。

  BEGIN与END定义的动作仅仅执行一次,而其他pattern-action需要去和每条record去匹配,若满足就执行action。

     在所有的pattern-actoin组合中,任何一方都可以为空,只是:

      a。 若pattern为空,则表示默认都满足条件;

      b。 若整个{action}都不写,默认打该record,即{print $0}; 若action为空,但带有{},即为pattern{},则表示不执行任何动作。

    因此,awk命令使用形式如下:

awk [-options] 'BEGIN{actionBEGIN} pattern1{action1} pattern2{action2} ......END{actionEND}' files
  • 5. awk实例
awk 'BEGIN{FS=":";count=0;}{count++;} $3>500 {print $1} END{print "Num of users:" count;}' /etc/passwd 

  本例子有四个pattern-action:

  a。BEGIN{FS=":";count=0;}  表示在处理所有记录前,将field分割符设置为“:”,同时定义了一个变量count值为0;

  b。{count++;}   没有pattern,所有行就要执行,count用来统计行数;

  c。$3>500 {print $1} passwd使用“:”分割后,$1是用户名,$3是id值。这个模式的意思是:将id值大于500的用户打印出来;

  d。END{print "Num of users:" count;} 表示在处理完所有的记录后,打印出行数。

  • 后记

  本文主要从概念说介绍了awk,后续将会从更为具体的方面学习记录awk。

  

posted @ 2012-12-18 00:47  dvking  阅读(1364)  评论(2编辑  收藏  举报