日历

2017年十二月
« 9月    
 123
45678910
11121314151617
18192021222324
25262728293031

最近评论

    AWK的使用

    awk的使用 第十四部分 awk的内部变量

        awk的内部变量的个数不多,在这里介绍的时候就不按照字母顺序排列了,而是按相关性分类说明。

        ARGC         
        ARGC表示命令行上除了选项-F,-v,-f等选项及其所对应的参数之外的所有参数的个数。如果将“awk程序”直接写在命令行上,那么ARGC是不会把“awk程序”计算在内的。

        ARGV         
        ARGV是一个数据,用来记录命令行上的参数的名称。 执行下列命令:
    [root@myfreelinux pub]# awk ‘BEGIN{printf(“ARGC=%d\n”,ARGC);for(a in ARGV)printf(“ARGV[%d]=%s\n”,a,ARGV[a]);}’ inte integer
    ARGC=3
    ARGV[0]=awk
    ARGV[1]=inte
    ARGV[2]=integer
        需要注意当ARGC = 3 时,命令列上只指定了2 个文件。
    awk的参数-F\t 表示以tab 为栏位分隔字符FS(field seporator);-v a=8 是用以初始化程序中的变量。

    AWK的使用

    awk的使用 第十三部分 awk的字符串和数学函数

        awk 的內建函数(Built-in  Functions)        

        一、字符串函数 
        语法:index( 原字符串,寻找的子字符串):
        解释:若原字符串中含有欲找寻的子字符串,则返回该子字符串在原字符串中第一次出现的位置,如果没有出现该子字符串则返回0。
        例如执行:
        [root@myfreelinux pub]# awk ‘BEGIN{print index(“0411-8888-9999″,”-8″)}’
        5   是返回值,实际上检索到“-8”时,“-”在第五位,所以返回值就是5了。

                       
        语法:length(字串)
        解释:返回该字串的长度。 
        例如执行:
    [root@myfreelinux pub]# awk ‘BEGIN{print length(“0411-8888-9999”)}’
    14 是返回值

    AWK的使用

    awk使用 第十二部分 awk主题函数Actions的指令语法

        awk的Actions一般由下列指令(statement)所组成:    
    1、 表达式 ( function calls, assignments..)    
    2、print 表达式列表    
    3、printf( 格式化字符串, 表达式列表)    
    4、if( 表达式 ) 语句 [else 语句]   
    5、while( 表达式 ) 语句    
    6、do 语句 while( 表达式)   
    7、for( 表达式; 表达式; 表达式) 语句    
    8、for( variable in array) 语句    
    9、delete    
    10、break    
    11、continue    
    12、next    
    13、exit [表达式]    
    14、语句
        在awk 中大部分指令和C 语言中的用法一致,这里仅介绍比较常用或容易混淆的指令的用法。

    AWK的使用

    awk的使用 第十一部分 awk中常用的模式

       awk 通过判断模式(Pattern)的值来决定是否执行其后对应的动作(Actions)。首先来看一下awk中几个常见的模式,在前十部分中,有一些模式已经做了介绍,在这里再总结一下:           
      

      1、BEGIN是awk 的保留字,是一种特殊的模式。                
         BEGIN 成立(其值为true)的时机是:“awk 程序一开始执行,还没有读取任何数据之前”。 所以在BEGIN{ Actions} 语法中,Actions只在程序一开始执行时被执行一次。当awk 从数据文件读入数据行后,BEGIN 便不再成立,所以不论数据文件有多少数据行数据,Actions也不会被再次执行。一般情况下,把“与数据文件内容无关”和“只需执行ㄧ次”的部分放在以BEGIN 为模式的Actions中。
        比如:[root@myfreelinux pub]# cat BEGIN.awk
    #!/bin/awk -f
    BEGIN{
    FS=”[ \t:]+”; #设置awk分割字段的默认方式
    RS=””  #设置awk分割数据行的方式

    AWK的使用

    awk的使用 第十部分 使用awk编写递归程序的实例

        awk 中除了函数的参数列(Argument List)上的参数(Arguments)外,所有变量无论在什么地方出现,均被视为全局变量。全局变量的生命周期持续到程序结束。全局变量不论在function外还是function内都可以使用,只要变量名称相同,所使用的就是同一个变量。但是递归函数会调用会调用到函数本身,所以编写这里函数是需要特别注意。
         例如:编辑一个awk脚本程序,内容如下:
    [root@myfreelinux pub]# cat argument.awk
    #!/bin/awk -f
    BEGIN{
    x=35;
    y=45;
    test_variable(x)
    printf(“Return to main: arg1=%d,x=%d,y=%d,z=%d\n”,arg1,x,y,z)
    }
    function test_variable(arg1)

    AWK的使用

    awk的使用 第九部分 使用awk编写可交互的程序

         在执行编写的awk程序时,awk会自动从数据文件中读取数据并进行处理,直到文件结束。实际上,只要将awk读取数据的来源改成键盘输入,那么就可以设计与awk 交互的程序了。
        首先看一个交互的程序。这个系程序能够实现输入一个英文单词,程序打印出该词对应的汉语意思,并继续等待用户输入新的英文单词。首先编辑一个数据文档data.dat,内容如下:
    [root@myfreelinux pub]# cat data.dat
    man 男人
    girl 女孩
    boy 男孩
    rose 玫瑰
    apple 苹果
    banana 香蕉

    AWK的使用

    awk的使用 第八部分 awk如何读取命令行的参数

       在linux/unix中大部分的应用程序都允许用户在命令之后增加一些参数,在执行awk 程序是,也可以在awk程序后增加一些参数,这些参数一般是用来指定数据文件的文件名。这里,我们看一下awk程序是如何使用这些参数的。   建立文件analyse.awk,内容如下:
    root@myfreelinux pub]# cat analyse.awk
    #!/bin/bash
    awk ‘BEGIN{
    for(i=0;i<ARGC;i++)
     print ARGV[i];# 依次印出awk所记录的参数
    }’ $*
     执行结果如下:
    [root@myfreelinux pub]# bash analyse.awk first-arg second-arg
    awk
    first-arg
    second-arg

    AWK的使用

    awk使用 第7部分 awk对多行数据的处理实例

        awk 每次从数据文件中只读取一行数据进行处理,这是因为awk中有一个内建变量RS(Record Separator) ,RS将文件中的数据分隔成以行为单位的记录record。RS默认值以”\n”(跳行符号)分隔数据文件中的信息,所以默认情况下awk 中一行数据就是一行Record。但有些文件中一行Record涵盖了多行数据,这种情况下不能再以”\n” 来分隔Records。最常使用的方法是相邻的Records之间改用一个空白行来分隔。在awk程序中,令RS= “”(空字符串)后,awk把会空白行当成来文件中Record的分隔符。显然awk对RS=””另有深意,简单来说是这样的,当RS=”” 时:多个相邻的空白行,awk仅作为一个Record Saparator(awk不会在多个相邻的空白行之中选取一行做为空的Record) ;awk会略过(skip)文件头和文件尾的空白行,所以不会因为有这样的空白行,造成awk多读了二行空的数据。下面举个例子看一下,首先建立一个数据文件myfreelinux.dat,内容如下:
    [root@myfreelinux pub]# cat myfreelinux.dat

     

    AWK的使用

    awk的使用 第六部分 awk编程的几个实例

        在这里举个例子,统计上班到达时间及迟到次数的程序。这程序每日被执行时将读入二个文件:员工当日上班时间的数据文件 ( arrive.dat ) 存放员工当月迟到累计次数的文件当程序执行执完毕后将更新第二个文件的数据(迟到次数), 并打印当日的报表。
        此程序的步骤分析如下:
        [6.1] 在上班数据文件arrive.dat之前增加一行标题 “ID Number Arrvial Time”,并产生报表输出到文件today_result1中。   
        [6.2]将today_result1上的数据按员工代号排序, 并加注执行当日日期;  产生文件today_result2
        [6.3] 将awk程序包含在一个shell script文件中
        [6.4] 在today_result2 每日报表上,迟到者之前加上”*”,并加注当日平均上班时间;产生文件today_result3
        [6.5] 从文件中读取当月迟到次数, 并根据当日出勤状况更新迟到累计数。

    AWK的使用

    awk的使用 第五部分 在awk中使用shell命令

       awk程序中允许使用Shell指令,使用管道在awk和系统中进行数据传递,所以awk可以很容易的使用系统资源。 
      比如写一个awk程序来打印出当前系统上有多少用户登录。awk的脚本文件名为usernumber.awk,脚本内容如下:

    [root@benet pub]# cat usernumber.awk
    #!/bin/awk -f
    BEGIN{
    while(“who”|getline) n++;
    print n;
    }
        执行结果如下:
    [root@benet pub]# awk -f usernumber.awk
    2 #即有两个用户登录了系统

    AWK的使用

    awk的使用 第4部分 在awk中使用数组

        awk程序中允许使用字符串当做数组的下标(index),这个特点有助于资料的统计。(使用字符串当下标的数组称为Associative  Array)
        首先建立一个名为kecheng.dat数据文件,内容是学生选课的内容;第一栏为学生姓名,其后为该生所学课程,内容如下:
     [root@benet pub]# cat kecheng.dat
    zhangsan math english chinese
    lisi     computer chinese english
    wangwu dianzi chinese math
    zhaoliu huanjing english chinese
        awk中数组不需要声明,也不用指定数组的大小,直接使用字符串当数组的下标(index)。 以上边学生选课为数据文件统计一下kecheng.dat 中学习各门课程的人数。
        这种情况,有二项信息必须储存: (a) 课程名称, 如:math,English,共有哪些课程事先并不明确。 (b)各课程的选修人数。 如: 有几个人选修了“math”。

    AWK的使用

    awk的使用 第三部分 awk如何选择正确的行

        在awk使用方法中,Pattern{ Action }是awk使用的最主要语法。如果Pattern的值为真则执行它后方的Action。awk中常使用”关系表达式” (Relational Expression)当做Pattern。  
        awk 中除了>,<,==,!= 等关系运算符(Relational Operators)外,另外提供 ~(匹配match),!~(不匹配Not Match)二个关系运算符。利用这两个运算符,可判断某字符串是否包含能匹配所指定正则表达式的子字符串。 有这么多关系运算符,使用awk可以轻易的进行字符串的比较,并编写字符串处理的程序。  
        例如,单位的职工如下所示:
    [root@benet pub]# cat emp.dat
    A101 chenying 100 210
    A304 linxiyu  110 215
    S283 degnming 130 209
    S267 liuchao  125 220
    B108 hejing    95 210

    AWK的使用

    awk的使用 第二部分 awk的运行方式

        在linux/UNIX 的命令行上输入一下格式的指令: ( “$”表Shell命令行上 的提示符号)
        $awk   ‘awk程序’   数据文件名
        上面这条语句中,awk会先编译该程序, 然后执行该程序来处理所指定的数据文件。
        awk程序的主要结构: awk程序中主要语法是 Pattern { Actions},即模式{动作}, 所以常见的awk 程序的机构如下:
        Pattern1 { Actions1 }
        Pattern2 { Actions2 }
        ……
        Pattern3 { Actions3 }
        Pattern 是什么? awk 可接受许多不同型态的Pattern。 一般常使用 “关系表达式”(Relational expression) 来当成 Pattern。 例如: x > 34 是一个Pattern, 判断变x与34是否存在大于的关系。 x == y是一个Pattern, 判断变量x与变量y是否存在等于的关系。 上式中 x>34 ,x ==y 便是典型的Pattern。 […]

    AWK的使用

    awk的使用 第一部分

    awk概述
        为什么使用awk: awk 是一种程序语言。 它具有一般程序语言常见的功能。 因awk语言具有某些特点, 如:使用直译器(Interpreter)不需先行编译; 变量无类型之分(Typeless), 可使用文字当数组的下标 (Associative Array)。。。等特色。 因此,使用awk撰写程序比起使用其它语言更简洁便利且节省时间。awk还具有一些内建功能,使得awk擅于处理具数据行(Record), 字段(Field)型态的资料; 此外, awk 内建有管道(pipe) 的功能,可将处理中的数据传送给外部的Shell命令加以处理, 再将Shell命令处理后的数据传回awk程序, 这个特点也使得awk程序很容易使用系统资源。由于awk具有上述特色, 在问题处理的过程中,可轻易使用awk来撰写一些小工具;这些小工具并非用来解整个大问题,它们只扮演解个别问题过程的某些角色, 可藉由Shell所提供的管道(pipe)将数据按需要传送给不同的小工具进行处理,以解决整个大的问题。 这种解决方式, 使得这些小工具可因不同需求而被重复组合及重用(reuse); 也可藉此方式来先行测试大程序原型的可行性与正确性,将来若需要较高的执行速度时再用C语言来改写。这是awk最常被应用之处。 若能常常如此处理问题,  读者可以以更高的角度来思考抽象的问题,不会被拘泥于细节的部份。