设为首页 加入收藏

TOP

awk知识点全回顾(五)
2017-10-13 10:37:21 】 浏览:6381
Tags:awk 知识点 回顾
0"的长度。
  • substr(str1,p):返回str1中从p位置开始的后缀字符串。
  • substr(str1,p,n):返回str1中从p位置开始,长度为n的子串。
  • match(str1,regexp):如果regexp能匹配str1,则返回匹配起始位置。否则返回0。它会设置内置变量RSTART和RLENGTH的值。
  • split(str1,array,sep):使用字段分隔符sep将str1分割到数组array中,并返回数组的元素个数。如果未指定sep则采用FS的值。因此该函数用于切分字段到数组中,下标从1开始。
  • sprintf(fmt,expr):根据printf的格式fmt,返回格式化后的expr。
  • sub(regexp,rep,str2):将str2中第一个被regexp匹配的字符串替换成rep,替换成功则返回1(表示替换了1次),否则返回0。注意是贪婪匹配。
  • sub(regexp,rep):将"$0"中第一个被regexp匹配的字符串替换成rep,替换成功则返回1,否则返回0。注意是贪婪匹配。
  • gsub(regexp,rep,str2):将str2中所有被regexp匹配的内容替换成rep,并返回替换的次数。
  • gsub(regexp,rep):将"$0"中所有被regexp匹配的内容替换成rep,并返回替换的次数。
  • toupper(str):将str转换成大写字母,并返回新串。
  • tolower(str):将str转换成小写字母,并返回新串。
  • 关于替换函数sub和gsub,可以在替换字符串rep中使用"&"符号表示反向引用,引用的是整个被匹配的部分。

    awk 'BEGIN{ print index("banana","na") print length("banana") print match("banana","na.*") print toupper("banana") print substr("banana",3)}' 3 6 3 BANANA nana
    
    awk 'BEGIN{str1="x&x";str2="banana"
            print sub(/a.*n/,str1,str2)
            print str2}' 
    1
    bxananxa
    
    awk 'BEGIN{ print match("banana",/a.*n/) print RSTART,RLENGTH}' 2 2 4
    
    awk 'BEGIN{print sprintf("hello %i world %5s","123","abc")}' hello 123 world abc
    
    awk 'BEGIN{ name="Ma long shuai" split(name,myname) for (i in myname){ print myname[i]} }' Ma long shuai
    

    纵观上述字符串函数,没有一个函数可以将匹配成功的字符串输出出来。但借助match()和RSTART、RLENGTH可以实现。

    例如,取出"Ma:long:shuai"中的"long"并输出。

    awk 'BEGIN{ name="Ma:long:shuai" if (match(name,/:[^:]*:/)){ print substr(name,RSTART+1,RLENGTH-2)}}' long
    

    10.自定义函数

    function name(parameter-list) {
        statements
    }
    

    函数中的变量不影响函数外的变量,但可以使用外部变量。参数列表使用逗号分隔,这些参数只在函数内部生效。

    可以在awk的引号内任意位置处定义函数(即使是BEGIN之前或END之后),且函数的调用位置可以在函数的定义位置之前。但注意,函数必须不能定义在BEGIN或主输入循环或END内部,否则自定义函数的大括号会和包围action的大括号冲突而报错。即如下(1)-(4)处位置可定义定义函数,在任意位置处调用函数。

    awk '(1)BEGIN{ACTIONS}(2)PATTERN{ACTIONS}(3)END{ACTIONS}(4)'
    

    在函数的statements中,可以使用return expression语句,表示函数的返回值。

    例如,创建一个"向字符串指定位置处插入一个字符"的函数。

    awk 'function insert(STRING, POS, INS) { before_tmp = substr(STRING, 1, POS) after_tmp = substr(STRING, POS + 1) return before_tmp INS after_tmp } BEGIN{print insert("banana",3,"x")}'
    

    11.getline函数

    getline函数用于从文件、标准输入或管道中读取数据,并按情况设置变量的值。getline可以自动不断的加载下一行。如果能读取记录,则getline的返回值为1,遇到输入流的尾部时,返回值为0,不能读取记录(如文件没有读取权限、文件不存在)时,返回值为“-1"。

    其中:

    • getline:会从主输入文件中读取记录。会同时设置$0,NF,NR,FNR。
    • getline var:会从主输入文件中读取记录,并将读取的记录赋值给变量var。会同时设置var,NR,FNR。
    • getline <file:从外部文件file中读取记录。同时会设置$0,NF。
    • getline var <file:从外部文件file中读取记录,并将读取的记录赋值给变量var。会同时设置var。
    • cmd | getline:从管道中读取记录。会同时设置$0,NF。
    • cmd | getline var:从管道中读取记录,并将读取的记录赋值给变量var。会同时设置var。

    也就是说:

    1. 当getline从非主输入文件读取记录时,不会设置NR和FNR;
    2. 当getline后没有给定变量var时,会将读取的记录赋值给$0,于是会同时设置NF并切分成字段;否则将读取的记录赋值给变量var,不会设置NF切分字段。

    仍然注意,从外部文件file中读取记录时,需要使用双引号包围文件名,否则被当成awk中的变量。

    例如,执行Linux下的who命令并传递给getline读取,每读取一行记录,变量n自增1。

    while ("who" | getline)
    n++
    

    将Linux命令date的结果保存到awk的变量date中。

    "date" | getline date
    

    当写成循环时,如:

    while (getline <"file"){
        cmd...
    }
    

    这是不安全的,因为当无法读取file时,返回值为"-1",而whi

    首页 上一页 2 3 4 5 6 7 下一页 尾页 5/7/7
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    上一篇linux下文件和目录 下一篇ActiveMQ配置使用 for CentOS6

    最新文章

    热门文章

    Hot 文章

    Python

    C 语言

    C++基础

    大数据基础

    linux编程基础

    C/C++面试题目