zoukankan      html  css  js  c++  java
  • awk内建函数

    内建函数

    length()

    获得字符串长度

    cat score.txt
    Marry   2143 78 84 77
    Jack    2321 66 78 45
    Tom     2122 48 77 71
    Mike    2537 87 97 95
    Bob     2415 40 57 62
    
    awk '{print $1, length($1)}' score.txt
    Marry 5
    Jack 4
    Tom 3
    Mike 4
    Bob 3
    

    split()

    将字符串按分隔符分隔,并保存至数组

    head -1 /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    
    head -1 /etc/passwd|awk '{split($0,arr,/:/);for(i=1;i<=length(arr);i++) print arr[i]}'
    root
    x
    0
    0
    root
    /root
    /bin/bash
    

    getline

    从输入(可以是管道、另一个文件或当前文件的下一行)中获得记录,赋值给变量或重置某些环境变量

    从shell命令date中通过管道获得当前的小时数

    date
    Tue Mar 20 16:15:52 CST 2018
    
    awk 'BEGIN{"date"|getline;split($4,arr,/:/);print arr[1]}'
    16
    

    从文件中获取,此时会覆盖当前的$0。

    cat a.txt
    a1
    a2
    cat b.txt
    b1
    
    awk '{getline <"a.txt";print $0}' b.txt 
    a1
    awk '{getline <"b.txt";print $0}' a.txt 
    b1
    a2
    

    赋值给变量

    awk '{getline a <"a.txt";print $0"---"a}' b.txt 
    b1---a1 
    

    读取下一行(也会覆盖当前$0),此时表示只对偶数行进行处理,如果最后一行是偶数行,也对最后一行处理

    cat n.txt
    1
    2
    3
    4
    5
    awk '{getline;total+=$0}END{print total}' n.txt
    11
    

    next

    作用和getline类似,也是读取下一行并覆盖$0,区别是next执行后,其后的命令不再执行,而是读取下一行从头再执行

    跳过以a-s开头的行,统计行数,打印最终结果

    awk '/^[a-s]/{next}{count++}END{print count}' /etc/passwd
    

    合并相同列的两个文件

    cat e.txt
    姓名 学号
    张三 00001
    李四 00002
    王五 00003
    cat f.txt
    学号 分值
    00003 90
    00002 75
    00001 80
    
    # 这里当读第一个文件时NR==FNR成立,执行a[$1]=$2,然后next忽略后面的。读取第二个文件时,NR==FNR不成立,执行后面的打印命令
    awk 'NR==FNR{a[$1]=$2;next}{print $0,a[$2]}' f.txt e.txt
    姓名 学号 分值
    张三 00001 80
    李四 00002 75
    王五 00003 90
    
    

    sub(regex,substr,string)

    替换字符串string(省略时为$0)中首个出现匹配正则regex的子串substr

    echo 178278 world|awk 'sub(/[0-9]+/,"hello")'
    hello world
    

    gsub(regex,substr,string)

    与sub()类似,但不止替换第一个,而是全局替换

    head -n5 /etc/passwd|awk '{gsub(/[0-9]+/,"----");print $0}' 
    root:x:----:----:root:/root:/bin/bash
    bin:x:----:----:bin:/bin:/sbin/nologin
    daemon:x:----:----:daemon:/sbin:/sbin/nologin
    adm:x:----:----:adm:/var/adm:/sbin/nologin
    lp:x:----:----:lp:/var/spool/lpd:/sbin/nologin
    

    substr(str,n,m)

    切割字符串str,从第n个字符开始,切割m个。如果m省略,则到结尾

    echo "hello,世界!"|awk '{print substr($0,8,1)}'
    界
    

    tolower(str)和toupper(str)

    表示大小写转换

    echo "hello,世界!"|awk '{print toupper($0)}'
    HELLO,世界!
    

    system(cmd)

    执行shell命令cmd,返回执行结果,执行成功为0,失败为非0

    awk 'BEGIN{if(!system("date>/dev/null"))print "success"}'
    success
    

    match(str,regex)

    返回字符串str中匹配正则regex的位置

    awk 'BEGIN{A=match("abc.f.11.12.1.98",/[0-9]{1,3}./);print A}'
    7
    

    参考

    linux基础命令介绍八:文本分析 awk

  • 相关阅读:
    一探前端开发中的JS调试技巧(转)
    JavaScript模板引擎实例应用(转)
    本周汇总
    完美解决IE8不支持margin auto问题
    移动端H5适配流程
    原型继承
    每周笔记
    一个页面多个bootstrip轮播以及一个页面多个swiper轮播 冲突问题
    如何让整个网页倾斜
    前端知识体系
  • 原文地址:https://www.cnblogs.com/okokabcd/p/8610113.html
Copyright © 2011-2022 走看看