• awk 命令详解


    作用:awk 是一种编程语言, 用于在linux/unix 下对文本和数据进行处理。 数据可以来自标准输入(stdin),一个或多个文件, 或其他命令的输出。它支持用户自定义函数和动态正则表达式等先进功能, 是linux/unix下的一个强大编程工具。它在命令行中使用, 但更多是作为脚本来使用。 awk 有很多内建的功能, 比如数据,函数等。 这是它和C语言的相同之处。 
    awk 命令格式和选项
    语法形式:
    awk [options] 'script' var=value file
    awk [options]  -f scriptfile  var=value file

    常用命令选项:

    -F fs 指定输入分隔符,  fs 可以似乎字符串或正则表达式
    -v var=value 赋值一个用户定义变量,将外部变量传递给awk 
    -f scriptfile 从脚本文件中读取awk 命令

    awk 模式和操作

    awk 脚本是由模式和操作组成的
    *模式可以是一下任意一个
    /正则表达式/: 使用通配符的扩展集
    关系表达式: 使用运算符进行操作, 可以是字符串或数字的比较测试
    模式匹配表达式: 用运算符~ 匹配 ~! 不匹配
    BEGIN 语句块、pattern语句块、END语句块
    *操作
    操作由一个或多个命令,函数,表达式组成,之间用换行符或分号隔开, 并位于大括号内,主要部分是:
    变量或数组赋值 , 输出命令, 内置函数, 控制流语句

    awk 脚本基本结构

    awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
    awk "BEGIN{ i=0} {i++} END{ print i}" file
    awk 'BEGIN{ i=0} {i++} END{ print i}' file
    一个awk 脚本通常由: BEGIN语句块,能够使用模式匹配的通用语句块,END语句块3本分组成, 这三个部分是可选的。任意一部分都可以不出现在脚本中, 脚本通常是在单引号或双引号中。
    awk 的工作原理
    awk 'BEGIN{ commands} pattern {commands} END{ commands}'
    第一步:执行BEGIN{ commands} 语句块中的语句
    第二部: 从文件或标准输入(stdin)读取一行, 然后执行pattern {commands} 语句块,它逐行扫描文件,从第一行到最后一行重复这个过程, 知道文件全部被读取完毕
    第三部: 当读取至输入流末尾时, 执行END{commands}语句块
    BEGIN: 在awk 开始从输入流中读取行之前被执行, 这是可选语句块 , 比如变量初始化,打印输出列表的表头等语句通常可以写在BEGIN语句块中
    pattern: 通用命令是最重要的部分,它也是可选的, 如果没有提供pattern 与句酷,则默认执行{pring},即打印每一个读取到的行,awk 读取的每一行都会执行该语句块
    END: 在awk输入流读取完所有的行之后即被执行,比如所有行的汇总信息都是在END语句块中完成 ,可选

    实例:

    echo -e "A line 1 A line 2" | awk 'BEGIN{ print "start"} {print} END{print "end"}'
    echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }' 
    v1 v2 v3
    当使用不带参数的print时,它就打印当前行,当print的参数是以逗号进行分隔时,打印时则以空格作为定界符。在awk的print语句块中双引号是被当作拼接符使用
    echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' v1=v2=v3
    双引号拼接使用
    awk 内置变量:
    说明:【A】awk 【N】nawk【P】POSIXawk【G】gawk 表示第一个支持变量的工具
    $n 当前记录的第n个字段, 当n =0 时包括整行
    [N] ARGC 命令行参数的数目
    [G] ARGIND 命令行中当前文件的位置 从0 开始算
    [N] ARGV 包含命令行参数的数组
    [G] CONVFMT 数字转换格式(默认值%。6g)
    [P] ENVIRON 环境变量关联数组
    [N] ERRNO 最后一个系统错误的描述
    [G] FIELDWIDTHS 字段宽度列表 (空格键分隔)
    [A] FILENAME 当前输入文件的名
    [P] FNR 同NR 但相对于当前文件
    [A] FS 字段分隔符(默认是空格)
    [G] IGNORECASE 如果为真, 则进行忽略大小写的匹配
    [A] NF 表示字段数, 在执行过程中对应于当前的字段数
    [A] NR 表示记录数, 在执行过程中对应于当前的行号
    [A] OFMT 数字的输出格式(默认是%。6g)
    [A] ORS 输出记录分隔符 (默认是一个换行符)
    [A] OFS 输出字段分隔符(默认是一个空格)
    [A] RS 记录分隔符(默认是一个换行符)
    [N] RSTART  由match 函数所匹配的字符串的第一个位置
    [N] RLENGTH 由match 函数所匹配的字符串长度
    [N] SUBSEP 数组下标分隔符(默认值是34)

    实例:

    *echo -e "line1 f2 f3 line2 f4 f5 line3 f6 f7" | awk '{print "line No:"NR",No of fields:"NF,"$0="$0."$1="$1,"$2="$2,"$3="$3}'
    Line No:1, No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3
    Line No:2, No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5
    Line No:3, No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7
    *echo -e "line1 f2 f3 line2 f4 f5" | awk '{print $NF}'
    print $NF 可以打印出一行中的最后一个字段, 使用$(NF-1) 是打印倒数第二个字段。
    *echo -e "line1 f2 f3 line2 f4 f5" | awk '{print $2,$3}'
    打印每一行的第二和第三个字段
    *awk 'END{ print NR}' filename
    统计文件中的行数
    *seq 5 | awk 'BEGIN{ sum=0; print "总和:"} {print $1"+"; sum+=$1} END{print "等于"; print sum}'
    每行第一个字段值累加

    将外部变量值传递给awk 

    借助-v 选项,可以将外部值(并非来自stdin) 传递给awk
    VAR=1000
    echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'
    awk 运算与判断
    作为一种程序设计语言所应具有的特点之一, awk 支持多种运算, 这些运算与C语言提供的基本相同。awk 还提供了一系列内置的运算函数(如 log ,sqr ,cos,sin) 和一些对于字符串进行操作的函数(length,substr) 。这些函数的引用大大的提高了awk 的运算功能。 作为对条件转移指令的一部分, 反洗判断是美中程序设计语言都具备的功能, awk 也不例外,awk中允许进行多种测试, 作为样式匹配, 还提供了模式匹配表达式~ (匹配)和~! (不匹配) 。 作为对测试的一种扩充,awk 支持用逻辑运算符。

    *算术运算符:

    +  -    : 加减
    * / &:乘除 求余
    + - ! : 一元加,减和逻辑非
    ^***  : 求幂
    ++ -- : 增加或减少, 作为前缀或后缀 
    例: awk ‘BEGIN{ a=0; print  a++,++a;}'
      0  2 
      a++  : 先输出,再自加1,
      ++a  : 先自加1,再输出,
     所有用做算术运算符进行操作, 操作数自动转为数值, 所有非数值都变为0 
    *赋值运算符
    =  +=  -=  *=  /=  %=   ^=   **=     赋值语句
    例: a+= 5;   a=a+5;
    *逻辑运算符
    ||  或
    && 与
    例: awk 'BEGIN{ a=1;b=2; print (a>5 &&b<=2), (a>5) || b<=2);}'   
    0   1
    *正则运算符
    ~   ~!
    例: awk 'BEGIN{ a="100test"; if(a ~ /^100*/) {print "ok" ;} }'
    *关系运算符
    <  <=  >  >=  !=   ==  关系运算符
    例: awk 'BEGIN{ a=11; if (a>9) {print "ok"}}'
    >< 可以作为字符串比较,也可以用作数值比较, 关键看操作数如果是字符串就会转换为字符串比较。 两个都为数字才转为数值比较。  字符串比较: 按照ASCII 码顺序比较。

    * 其他运算符

    $ 字段引用
    空格 字符串连接符
    ?:  c条件表达式
    in 数组中是否存在某键值
    例: awk 'BEGIN{a="b"; print a=="b"? "ok":"err";}'
            awk 'BEGIN{a="b"; arr[0]="b"; arr[1]="c" ; print (a in arr);}'    打印所在数组位置0  
    * 运算级优先级表
  • 相关阅读:
    MHA自动切换流程
    手写源码之 简单实现on emit off
    手写源码 -- bind,call,aplly
    多维数组转化为一维数组
    electron+vue中使用nodeJs的fs模块以及上传文件
    制作海报
    vue中引入播放器(百度播放器和腾讯云播放器)
    webpack配置
    webpack
    css样式
  • 原文地址:https://www.cnblogs.com/LinuxSuDa/p/4435395.html
Copyright © 2020-2023  润新知