zoukankan      html  css  js  c++  java
  • Linux awk学习

    一、awk命令格式
    awk option program file
    -F fs               指定行中分隔数据字段分隔符
    -f file             指定读取程序的文件名
    -v var=value        定义awk程序中的一个变量及其默认值
    -mf N               指定要处理的数据文件中的最大字段数
    -mr N               指定数据文件中的最大数据行数
    -W keyword          指定awk的兼容模式或警告等级
    二、awk进阶
    1、使用变量
    awk支持两种不同类型的变量:内建变量,自定义变量。
    1> 字段和数据行分隔符变量
    数据字段变量允许使用$符号和数据字段在数据行中位置对应的数值来引用该数据行中的字段。因此,要引用数据行中的第一数据字段,就用$1。。。
    字段是由字段分隔符来划定。默认情况下,字段分隔符是一个空白字符,也就是空格符或制表符(tab)。
    awk数据字段和数据行变量
    FIELDWIDTHS     由空格分隔开的定义了每个数据字段确切宽度的一列数字
    FS              输入字段分隔符
    RS              输入数据行分隔符
    OFS             输出字段分隔符
    ORS             输出数据行分隔符
    $ cat data5
    data11,data12,data13,data14,data15
    data21,data22,data23,data24,data25
    data31,data32,data33,data34,data35
    $ awk 'BEGIN{FS=","} {print $1,$2,$3}' data5
    data11 data12 data13
    data21 data22 data23
    data31 data32 data33
    $ awk 'BEGIN{FS=",";OFS="-"} {print $1,$2,$3}' data5
    data11-data12-data13
    data21-data22-data23
    data31-data32-data33
    FIELDWIDTHS变量允许读取数据行,而不用字段分隔符来划分字段。在一些应用程序中,不用字段符,数据是被放置在数据行的某些列中。在这种情况下,你必须设定FIELDWIDTHS变量来匹配数据在数据行中的位置。这里是根据提供的字段宽度大小来计算字段。
    $ cat data1b 
    1005.3247596.37
    115-2.349194.00
    05810.1298100.1
    $ awk 'BEGIN{FIELDWIDTHS="3 5 2 5"}{print $1,$2,$3,$4}' data1b 
    100 5.324 75 96.37
    115 -2.34 91 94.00
    058 10.12 98 100.1
     
    2> 数据变量
    其它awk内建变量
    ARGC          当前命令行参数个数
    ARGIND        当前文件在ARGV中的位置
    ARGV          包含命令行参数的数组
    ERRNO         当读取或关闭输入文件发生错误时的系统错误号
    FILENAME      用于awk输入数据的数据文件的文件名
    FNR           当前数据文件中的数据行数
    NF            数据文件中的字段总数
    NR            已处理的输入数据行数目
    $ awk 'BEGIN{print ARGC,ARGV[1]}' data1
    2 data1
    $ awk 'BEGIN{FS=",";OFS=","}{print $1,$NF}' data5
    data11,data15
    data21,data25
    data31,data35
    2、自定义变量
    $ awk 'BEGIN{test="This is a test"; print test}'
    This is a test
    也可以在命令行上给变量赋值,即时改变变量的值。
    $ cat script1
    BEGIN{FS=","}
    {print $n}
    $ awk -f script1 n=2 data5
    data12
    data22
    data32
    3、处理数组
    1> 定义数组变量
    var[index] = element
    例如:
    capital["Ohio"] = "Columbus"
    $ awk 'BEGIN{
    > var[1] = 34
    > var[2] = 3
    > total = var[1] + var[2]
    > print total
    > }'
    37
    2> 遍历数组变量
    for(var in array)
    {
         statements
    }
    $ awk 'BEGIN{
    var["a"] = 1
    var["g"] = 2
    var["m"] = 3
    var["u"] = 4
    for(test in var)
    {
    print "Index:",test," - Value:",var[test]
    }
    }'
    Index: u  - Value: 4
    Index: m  - Value: 3
    Index: a  - Value: 1
    Index: g  - Value: 2
    3> 删除数组变量
    delete array[index]
     
    3、使用模式
    1> 正则表达式
    可以使用基本正则表达式(BRE)或扩展正则表达式(ERE)来过滤程序脚本作用在数据流中。
    $ awk 'BEGIN{FS=","} /11/{print $1}' data5
    data11
    2> 匹配操作符
    匹配操作符(matching operator)允许将正则表达式限定在数据行中的特定数据字段。匹配操作符是波浪线(~)。
    $1~/^data/
    这个表达式会过滤出第一个字段以文本data开头的所有数据行。
    $ awk 'BEGIN{FS=","} $2~/^data2/{print $0}' data5
    data21,data22,data23,data24,data25
    $1 !~/expression/
    表示排除正则表达式的匹配。
    3> 数学表达式
    可以使用任意的普通数学比较表达式
    x==y
    x<=y
    x<y
    x>=y
    x>y
     
    4、结构化命令
    1> if语句
    if(condition)
         statement1
    $ cat data6
    10
    5
    13
    59
    34
    $ awk '{if($1 > 20) print $1}' data6
    59
    34
    2> while语句
    while(condition)
    {
         statements
    }
    $ cat data7
    130 120 135
    160 113 140
    145 170 215
    $ awk '{total = 0; i = 1; while(i < 4) {total += $i; i++} avg = total/3; print "Average: ",avg}' data7
    Average:  128.333
    Average:  137.667
    Average:  176.667
    3> do-while语句
    4> for语句
     
    5、格式化打印
    printf命令的格式:
    printf "format string", var1, var2...
     
    6、内建函数
    1> 数学函数
    awk一些数学函数
    cos(x)
    exp(x)
    int(x)
    log(x)
    rand(x)
    sqrt(x)
    srand(x)
     
    2> 字符串函数
    asort(s [, d])
    asorti(s [, d])
    gsub(r, s, [, t])
    index(s, t)
    length([s])
     
    7、自定义函数
    function name([variables])
    {
         statements
    }
    function myrand(limit)
    {
         return int(limit * rand())
    }
     
    $ awk '
    function myprint()
    {
    printf "%-16s - %s\n", $1, $4
    }
    BEGIN{FS=","}
    {
    myprint()
    }' data5
    data11           - data14
    data21           - data24
    data31           - data34
  • 相关阅读:
    Java hello/hi的简单的网络聊天程序
    案例分析:设计模式与代码的结构特性
    网络相关的命令工具研究报告
    如何提高程序员的键盘使用效率
    分析一套源代码的代码规范和风格并讨论如何改进优化代码
    用例建模Use Case Modeling
    结合工程实践选题调研分析同类软件产品
    领域建模
    SecureCRT 连接虚拟机Linux
    用css固定div层在页面顶部和底部(兼容IE6)
  • 原文地址:https://www.cnblogs.com/sinaxyz/p/2824173.html
Copyright © 2011-2022 走看看