• linux命令之awk


    简介 

      awk命令的名称是取自三位创始人Alfred Aho 、Peter Weinberger 和 Brian Kernighan姓名的首字母,awk有自己的程序设计语言,设计简短的程序,读入文件,数据排序,处理数据,生成报表等功能。

         awk 通常用于文本处理和报表生成,最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。

         awk 通常以文件的一行为处理单位的,awk每接收文件的一行,然后执行相应的命令,来处理文本,完整的awk脚本通常用来格式化文本文件中的信息

    使用方式

                awk '{pattern + action}' {filenames}

                      pattern 表示 AWK 在数据中查找的内容,正则表达式,用斜杠括起来

                      action 是在找到匹配内容时所执行的一系列命令

                      花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组

    使用说明

         

    [hebinbin@iZ25y8wtfbqZ ~]$ awk '{print $0}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin

          依次对/etc/passwd 中的每一行执行 print 命令,所有输出都发送到 stdout,所得到的结果与执行 cat /etc/passwd 完全相同

         $0 $n表示

                                 

     -F参数:指定分隔符,可指定一个或多个

    root@iZ25me8kko3Z:~# awk -F "/" -F ":" '{ print $1 " " $9 " " $0 }' /etc/passwd
    root  root:x:0:0:root:/root:/bin/bash
    daemon  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
    bin  bin:x:2:2:bin:/bin:/bin/sh
    sys  sys:x:3:3:sys:/dev:/bin/sh

    只查看test.txt文件20-30行内容

    root@iZ25me8kko3Z:~# awk '{if(NR>=20 && NR<=30) print $1}' test.txt
    sock.close()
    print('%s
    break
    elif
    data
    data
    #print(data)
    #print(clients)
    #if
    if
    print(data)

    BEGIN 和 END 模块

        awk 在开始处理输入文件之前会执行 BEGIN 块,处理了输入文件中的所有行之后执行END块

    统计/etc/passwd的账户人数

    root@iZ25me8kko3Z:~# awk '{count++;print $0;} END{print "user count is ",count}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/bin/sh
    .................
    user count is  47

    count是自定义变量,没有初始化默认是0,action{}中的多个语句用 ;隔开

    root@iZ25me8kko3Z:~# awk 'BEGIN {count=0;print "[start] user count is ",count} {count=count+1;print $0} END{print "[end] user count is ",count}' /etc/passwd
    [start] user count is  0
    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/bin/sh
    .....................
    [end] user count is  47

    统计某个文件夹下的文件占用的字节数

    root@iZ25me8kko3Z:~# ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}'
    [end]size is  3090190

    awk运算符

    root@iZ25me8kko3Z:~# awk 'BEGIN{a=5;a+=5;print a}'
    10

      root@iZ25me8kko3Z:~# awk 'BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}'
      0 1

    root@iZ25me8kko3Z:~# awk 'BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}'
    0 1
    root@iZ25me8kko3Z:~# awk 'BEGIN{a="100testaa";if(a~/100/) {print "ok"}}'
    ok
    root@iZ25me8kko3Z:~# echo|awk 'BEGIN{a="100testaaa"}a~/test/{print "ok"}'
    ok
    root@iZ25me8kko3Z:~# awk 'BEGIN{a=11;if(a>=9){print "ok"}}'
    ok
    root@iZ25me8kko3Z:~# awk 'BEGIN{a;if(a>=b){print "ok"}}'
    ok
    root@
    root@iZ25me8kko3Z:~# awk 'BEGIN{a="b";print a=="b"?"ok":"err"}'
    ok
    root@iZ25me8kko3Z:~# awk 'BEGIN{a="b";print a=="c"?"ok":"err"}'
    err

    awk内置变量

     awk正则使用

        

          awk '/REG/{action} ' file,/REG/为正则表达式,可以将$0 中,满足条件的记录送入到:action 进行处理 

    root@iZ25me8kko3Z:/etc# awk '/root/{print $0}' passwd
    root:x:0:0:root:/root:/bin/bash

        awk '布尔表达式{action}' file 仅当对前面的布尔表达式求值为真时, awk 才执行代码块

    root@iZ25me8kko3Z:/etc# awk -F: '$1=="root"{print $0}' passwd
    root:x:0:0:root:/root:/bin/bash

    awk 的 if、循环和数组 

         if条件语句

      

    {
            if ($1=="foo"){
                    if($2=="foo"){
                            print "uno"
                    }else{
                            print "one"
                    }
            }elseif($1=="bar"){
                    print "two"
            }else{
                    print "three"
            }
    }

       

     循环结构

       do...while

    {
        count=1do {
            print "I get printed at least once no matter what"
        } while ( count !=1 )
    }

    for

    for ( initial assignment; comparison; increment ) {
        code block
    }

    break  continue

    x=1
    while(1) {
      print "iteration", x
      if ( x==10 ) {
        break
      }
      x++
    }
    x=1while (1) {
            if ( x==4 ) {
            x++
            continue
        }
        print "iteration", x
        if ( x>20 ) {
            break
        }
        x++
    }

     数组   AWK 中的数组都是关联数组,数字索引也会转变为字符串索引

    {
        cities[1]=”beijing”
        cities[2]=”shanghai”
        cities[“three”]=”guangzhou”
        for( c in cities) {
            print cities[c]
        }
        print cities[1]
        print cities[“1”]
        print cities[“three”]
    }

    常用字符串函数

  • 相关阅读:
    uva11021
    WC2019退役失败记
    北大集训2018垫底记
    NOI后训练记录
    NOI2018垫底记
    NOI前训练记录
    JSOI2018R2游(afo)记
    HNOI(AHOI)2018游记
    JSOI2018R1(九省联考)游(afo)记
    LR 8 Hello 戊戌
  • 原文地址:https://www.cnblogs.com/hellohell/p/9063044.html
Copyright © 2020-2023  润新知