美文网首页linux basic knowledge
[2020春假]Linux下的文本操作(awk篇)

[2020春假]Linux下的文本操作(awk篇)

作者: 巩翔宇Ibrahimovic | 来源:发表于2020-01-27 20:08 被阅读0次

    awk是真的难,学了一下,感觉还是云里雾里的,讲者说awk更像是一门语言,而不是一个行编辑工具,可能这个东西需要反复咀嚼吧。

    Chapter9 认识awk

    awk更像是脚本语言。

    awk用于"比较规范"的文本处理,用于统计数量并输出指定字段。

    使用sed将不规范的文本,处理为"比较规范的文本"。

    awk脚本的流程控制

    输入数据前例程 BEGIN{}

    主输入循环{}

    所有文件读取完成例程 END{}

    Chapter10 awk的字段

    awk的字段引用和分离

    记录和字段

    每行称作AWK的记录

    使用空格、制表符分隔开的单词称为字段

    可以自己制定分隔的字段

    字段的引用

    awk中使用 12 ... $n表示每一个字段

    awk '{ print $1,$2,$3}' filename

    awk可以使用 -F选项改变字段分隔符

    awk -F ',' '{print $1,$2,$3}'filename

    分隔符可以使用正则表达式

    # $0打印一整行
    awk '/^menu/{ print $0 }' /boot/grub2/grub.cfg
    #以单引号做分隔符,输出第二个字段
    awk -F "'" '/^menu/{ print $2}' boot/grub2/grub.cfg
    # x++显示指定的行
    awk -F "'" '/^menu/{ print x++,$2}' boot/grub2/grub.cfg
    

    Chapter11 awk表达式

    赋值操作符

    = 是最常用的赋值操作符,如

    var1 = "name" #awk等号左右可以加空格,也可以不加
    var2 = "hello" "world"
    var3 = $1
    

    其他赋值操作符

    ++自增 -- += -= *= /= %= ^=

    算数操作符

    + - * / % ^

    系统变量

    F5和OFS字段分隔符(输入的),OFS表示输出的字段分隔符。

    RS记录分隔符,默认的记录分隔符是\n

    NR和FNR行数。

    NF字段数量,最后一个字段内容可以用 $NF 取出。

    #BEGIN表示读入文件之前做的准备工作,如果不设置OFS的话,默认的分隔符是空格
    head -5 /etc/passwd | awk 'BEGIN{FS=":";OFS="-"}{print $1,$2}'
    
    head -5 /etc/passwd | awk 'BEGIN{RS=":"}{print $0}'
    #NR输出行号,$0输出行内容
    head -5 /etc/passwd | awk '{print NR, $0}'
    #输出字段数量
    head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print NF}'
    

    关系操作符

    < > <= >= == != ~ !~

    布尔操作符

    && || !

    Chapter12 awk判断和循环

    awk的条件和循环

    条件语句

    条件语句使用if开头,根据表达式的结果来判断执行哪条语句。

    if(表达式)
      awk语句1
    [else
      awk语句2
    ]
    

    如果有多个语句需要执行可以使用{}将多个语句括起来。

    cat kpi.txt
    user1 70 72 74 76 74 72
    user2 80 82 84 82 80 78
    user3 60 61 62 63 64 65
    user4 90 89 88 87 86 85
    user5 45 60 63 62 61 50
    #输出第二字段大于等于80的
    awk '{if($2>=80) print $1}' kpi.txt
    

    循环

    while 循环
       while(表达式)
          awk语句1
    do 循环
       do{
         awk 语句1
       }while(表达式)
    for循环
    for(初始值;循环判断条件;累加)
       awk语句1
    影响控制的其他语句
    break
    continue
    #计算一行的总值
    head -1 kpi.txt | awk '{for(c=2;c<=NF;c++) sum+=$c ;print sum}'
    #计算一行的平均值
    head -1 kpi.txt | awk '{for(c=2;c<=NF;c++) sum+=$c ;print sum/(NF-1)}'
    #计算各行平均值,要设置sum的初始值为0
    awk '{sum=0;for(c=2;c<=NF;c++) sum+=$c ;print sum/(NF-1)}'
    

    Chapter13 awk数组

    数组的定义

    数组:一组有某种关联的数据(变量),通过下标一次访问。

    数组名{下标}=值。

    下标可以使用数字也可以使用字符串。

    数组的遍历

    for(变量 in 数组名)

    使用 数组名 [变量] 的方式依次对每个数组的元素进行操作。

    删除数组

    delete 数组[下标]

    命令行参数数组

    ARGC,ARGV

    Chapter14 awk数组功能的使用

    vim result.awk
    {
    sum = 0
    for( column = 2 ; column <= NF ; column++)
      sum += $column
    average[$1] = sum /(NF-1)
    }
    END{
    for( user in average)
             sum_all += average[user]
    avg_all = sum_all/NR
    for( user in average)
            if( average[user] > avg_all)
                     above++
             else
                     below++
    print "above",above
    print "below",below
    }
    

    Chapter 15 awk函数

    算数函数

    sin() cos()

    int()

    rand() srand()

    #取整
    awk 'BEGIN{pi=3.14 ;print int(pi) }'
    

    字符串函数

    gsub(r,s,t)
    index(s,t)
    length(s)
    match(s,r)
    split(s,a,sep)
    sub(r,s,t)
    substr(s,p,n)
    

    自定义函数

    function 函数名(参数) {

    ​ awk语句

    ​ return awk变量

    }

    相关文章

      网友评论

        本文标题:[2020春假]Linux下的文本操作(awk篇)

        本文链接:https://www.haomeiwen.com/subject/uybethtx.html