【linux工具】awk学习笔记

2023-06-20 13:01:42 浏览数 (2)

AWK是linux中面向行(line)的编程语言,用于文本处理、提取、格式化、运算等各类文本操作

  1. 命令行awk
代码语言:javascript复制
   
   => 最简单用法
    
   -F
   -v var=value   #在awk中引入外部变量的方法之一
                    FIRST="aaa";SECOND="bbb"
                    awk -v fir=$FITST -v sec=$SECOND '{print fir,sec}' somefile               
   -f filename
   
  
代码语言:javascript复制
   # 两个基本概念
   记录   awk每次处理的一个数据流
   域     通过特定字符分割的一个条记录中的不同部分。
  1. 常用变量
代码语言:javascript复制
   FS (<=> -F) awk -F'-' '{print $1}' a.txt    FS="-"
   NF $NF  当前记录的总域数
   NR, FNR   Number of Record


   RS (记录分割符)
   OFS   输出域分隔符,默认空格
   ORS   输出记录分隔符,默认新行
  example: 
    awk -F ' '
    awk -F '[ ]'
    awk -F '[ ] '
   三者有区别么?

    解答:  第一个表示 分隔符为,单个或多个空格或者tab
        第二个表示一个空格
    第三个表示一个或多个空格。
  1. 模式与行为
代码语言:javascript复制
    BEGIN { actoin } "stdin 以前"
    END { action } "read 结束

    /regexp/  { actoin }            <=> /expression/ { action}
    /regexp1/,/regexp2/ { action } 

    expression { }
    expr1, exp2 { }

    expr2 && expr2 {}
    expr2 || expr2 {}
    ! expr {}
    
    expr ? : { action }
    
    special pattern
    ---------------
  1. awk 中的正则表达式
代码语言:javascript复制
    .       任意单个字符
    *       任意多个它前的字符
            一个以上它前面的字符
    ?       一个或者0个它前面的字符
    ^       行首
    $       行末
    |       或
    ()      分组
    []      [] 枚举成员,任意单个其中的字符
    r{m,n}  posix标准正则
  1. 变量,关联数组
代码语言:javascript复制
   使用即定义
   var = value
   array[key] = value   如果key是字符,应用双引号引起来  arr["tom"]=333
   array =

    delete array[index]
    delete array
    3. 操作符,
   $    域标识
   (...) 分组
      -- 自增,自减  
   ^ ** 乘方
     - * / % 
   && || ! 与,或,非
   ? :  三目操作符

   |
   |&  管道IO

   > < <= >= != ==
   ~ !~  正则匹配
   in 数组成员迭代(测试)

   =  = -= *= /= %= ^= **=

   space : 字符串连接操作符
  1. 操作符,
代码语言:javascript复制
   $    域标识
   (...) 分组
      -- 自增,自减  
   ^ ** 乘方
     - * / % 
   && || ! 与,或,非
   ? :  三目操作符

   |
   |&  管道IO

   > < <= >= != ==
   ~ !~  正则匹配
   in 数组成员迭代(测试)

   =  = -= *= /= %= ^= **=

   space : 字符串连接操作符
  1. 转意序列
代码语言:javascript复制
    n      换行
    t      tab
    f      浮点数
    r      回车
    v      垂直制表
    xhex digts
    ddd
   
  1. 控制结构,自定义函数
代码语言:javascript复制
    if (expr) { statement } [ else { statement } ]
    while (expr) { statement }

    do { statement } while (expr)

    for (expr1; expr2; expr3) { statement }
    for (var in array) { statement }

    break, continue
    exit [ expression ]
    { statement }

    ## confiured as --enable-switch
    swith () {
        case value|regexp : statement 
        ...
        [ default : statement ]
    }


    function max (a, b) {
        reuturn a > b ? a : b
    }
  1. I/O 控制
代码语言:javascript复制
    getline             set $0, NR, NF, FNR 
    getline <file       set $0, NF
    getline var         set var, NR, FNR
    getline var <file

    command |  getline [var]
    command |& getline [var]   co-process

    next
    nextfile            FILENAME, ARGIND, FNR=1

    system()
    fflush()

    print ...
    print ... >file
    print ... >>file
    print ... | command
    print ... |& command
    (协进程)

11, 常见函数

代码语言:javascript复制
    数学函数: int, rand, sqrt, srand, (exp, log, cos, sin, atan2) 
    # awk 'BEGIN{srand();r=int(rand()*10);print r}' file  srand()产生一个随机数种子,rand()生成0-1之间的一个随机数

    字符串函数:
        substr
        sub   将首个匹配的字符串替换
        gsub  将全部匹配的字符串替换
        length  
        index,   返回字串索引
        match,     返回匹配RE的位置
        split,
        x = sprintf ("xxx),
        printf,            格式化输出
        tolower,
        toupper, 

        strtonum,
        gensub,   gensub(r,s,h [,t]) 找到t中满足正则r的字符串并用s替换,若h为字母g,全部替换,若为数字几,就像第几个匹配的替换
                                     最后将被修改的整个串返回
        asort,   返回数组元素个数
        asorti   返回数组元素个数(操作后会将索引变成数字) except that the array indices are used for sorting,not the array
                                  values.when  done, the array is indexed numerically,and the values are
                                  those of the original indices.
代码语言:txt复制
时间函数: 
代码语言:javascript复制
       mktime,     mktime("YYYY MM DD HH MM SS") 返回这个时间到19700101开始的秒数
       strftime,  返回特定格式的时间  如 strftime("%y-%m-%d %H:%M:%S",systime()) 13-05-13 17:46:06
                   %a 星期几 %I 12小时格式  %p 显示(AM/PM) %Y 四位数的年 %U 一年第几周  %w 十进制表示星期几
                   %x 重设本地时间
       systime    返回以秒为单位的从1970年1月1日0点开始的秒数
代码语言:javascript复制
#位操作函数:
 lshift, rshift, and, or, xor, compl(补码 bitwise complement)
  1. 使用环境变量
代码语言:javascript复制
    ENVIRON        是一个数组,如  ENVIRON["HOME"]  (查看所有环境变量的命令env   查看所有变量:set,取消变量unset)
    PROCINFO       是一个数组,如  PROCINFO["uid"]  PROCINFO["ppid"] PROCINFO["pid"]   (查看线程:ps)
  1. 使用额外的awk函数库/脚本库, awk脚本的参数处理。
代码语言:javascript复制
    --source -f
    ARGC
    ARGV
    ARGIND



example:
       字符串 'aaabcccaaabbbccc',连续的字母作为一个子字符串,从左往右,去重复后,变为 'aaabcccbbb' , awk或sed实现,不使用管道。
awk

0 人点赞