————————————————

gawk进阶

gawk进阶

  • 内建变量

    • 在gawk程序内部使用的变量,用于提取和处理数据

      • 字段和记录变量(通过在BEGIN设置)

        • FILEDWIDTHS

          • 设定字段宽度
        • FS

          • 输入字段分隔符(默认空格和制表符)
        • RS

          • 输入记录分隔符(默认是换行符)
        • OFS

          • 输出字段分隔符
        • ORS

          • 输出记录分隔符
      • 数据变量

        • ARGC

          • 统计命令行参数的个数
        • ARGC[0]

          • 代表全部命令行参数
        • ARGC[1]

          • 代表第一个命令行参数
        • ENVIRON

          • 使用关联数组(文本作为索引的数组)提取shell环境变量
        • FNR

          • 统计当前文件已处理的记录数
        • NR

          • 统计已处理过的记录总数
        • NF

          • 统计字段总数和指代最后一个字段
  • 数组

    • 分类

      • 数字数组

        • 使用数字作为索引
      • 关联数组

        • 使用字符串作为索引
    • 定义数组

      • 格式

        array[index]=element

    • 提取数组值

      • 单个值

        array[index]

      • 多个值

    for (var in array) { print "index=",var ---- "value=", array[var] }
    - var存储的是索引值,array[var]存储的是数值

    • 删除数组变量

      • 格式

        delete array[index]

  • 模式

    • 正则表达式

      • 注意事项

        • 正则表达式必须出现在它要控制的程序的左花括号前面
      • 使用方法

        gawk 'BEGIN{FS=","} /xxx/{print $1} ' file

        • 以逗号为分隔符,从文件中匹配xxx,如果匹配成功,则打印包含xxx的行的第一个字段
    • 匹配操作符

      • 定义

        • 把正则表达式限定在行的特定字段,只从某个字段中匹配
      • 格式

        gawk '$x ~ /xxx/{xxx}' file
        gawk '$x !~ /xxx/{xxx}' file

      • 使用方法

        gawk 'BEGIN{FS=","} $1 ~ /^xxx/{print $0}' file

        • 以逗号为分隔符,从文件中的所有行的第一个字段中查找以xxx开头的字符,如果匹配成功,则打印其所在行的所有内容

        gawk -F: '$1 ~ /xxx/{print $1,$NF}' /etc/passwd

        • 以分号为分隔符,从/etc/passwd中的第一个字段中查找xxx,如果匹配成功,则打印包含所在行的第一个字段和最后一字段

        gawk -F: '$1 !~ /xxx/{print $1,$NF}' /etc/passwd

        • 以分号为分隔符,从/etc/passwd中的第一子u按中查找xxx,如果匹配成功,则打印除了xxx所在行的其他行的第一个字段和最后一个字段
  • 数字表达式

    • 表达式

      • 等号

        • ==
      • 小于等于

        • <=
      • 小于

        • <
      • 大于等于

        • >=
      • 大于

        • >
    • 使用方法

      • 匹配字符(完全匹配)

        gawk -F: '$1 == "xxx" {print $1} ' file

        • 以分号为分隔符,从文件中的第一个字段中,查找xxx,并打印出来
      • 匹配数值

        gawk -F: '$4==0{print $1}' /etc/passwd

        • 以分号为分隔符,从/etc/passwd中的第4个字段中查找数值等于0的行(root用户组),并打印改该的第一个字段
  • 结构化命令

    • if语句

      gawk '{   if (condition)                                                        
                     {statement}     
                else                                                                
                     {statement}                                                                    
           }'   file
      
    • while语句

      gawk '{   while (condition)                                                        
                     {statement}                                                       
            }' file
      
    • do..while语句

       gawk 'do                                                                     
            {statement}                                               
            while (condition)                                        
            '  file
      
    • for语句

      gawk ' for (var assignment;conditon ; interation process)' file

  • 格式化输出

    • printf

      • 格式

        printf "format string",var1,var2....

    • 格式化指定符(format string)

      • 定义

        • 通过控制字母指明变量的类型和如何显示,作为占位符,供变量使用。另外可利用修饰符进一步控制输出
      • 格式

        % [modified] control-letter

      • 控制字母(control-letter)

        • c

          • 显示ASCII字符
        • s

          • 显示一个字符串
        • i

          • 显示一个整数
        • f

          • 显示一个浮点数
      • 修饰符(modifier)

        • width

          • 指定输出字段的最小宽度
        • prec

          • 指定小数点位数或字符串的字符数
          • 字符串左对齐

    • 使用方法

      • gawk '{ printf %s,var1}' file

        • 显示一个字符串
      • gawk '{printf %s\n, %s\n, var1, var2}' file

        • 分行显示两个字符串
      • gawk '{printf %-16s\n , var1}' file

        • 强制一个字符宽度为16个字符,并且左对齐显示
      • gawk '{printf %5.1f\n,var1}' file

        • 显示5个字符,并且保留一位小数点
  • 内建函数

    • 数学函数

      - int(x)

      • 取整

      - rand(x)

      • 生成0到1的随机数(可通过*放大)

      • int( n * rand(x))

        • 随机数取整
      • exp(x)

        • 计算x的指数
    • 位操作函数

      • and(v1,v2)

        • v1,v2与运算
      • or(v1,v2)

        • v1,v2或运算
      • xor(v1,v2)

        • v1,v2异或运算
      • lshift(v1,x)

        • v1向左移x位
      • rshift(v1,x)

        • v1向右移x位
    • 字符串函数

      • asort( array1 )

        • 把数组array1(按元素值)排序后,索引值被替换成连续数字
      • asorti( array1 )

        • 把数组array1(按索引值)排序后,索引值被替换成新的连续数字
      • asort(arary1,array2)

        • 把数组array1(按元素值)排序后,索引值被替换成连续数字,并把排序后的的数组存储在array2中
      • asorti(array1,array2)

        • 把数组array1(按索引值)排序后,索引值被替换成新的连续数字,并把排序后的数组存储在array2中
      • index(s,x)

        • 返回字符串s中,x的索引值,没有结果返回0
      • lenth( [s] )

        • 返回字符串s的长度,没有指定s则返回$0的长度
      • split( s,array1)

        • 把字符串用FS字符分割后(需要在gawk指定)存储在array1中
      • split( s, array1 , r)

        • 把字符串用正则表达式分割后,放到array1中
      • substr(s,m,n)

        • 把字符串s从m处开始截取,截取n个长度字符串
    • 时间函数

      • systime()

        • 获取系统当前时间
      • strftime(format [,timestamp] )

        • 格式化时间
      • 使用方法

        • gawk 'print strftime("%A,%B %d,%Y" , systime())'

          • %A为星期x,%B %d为月+天,%Y为年份
  • 自定义函数

    • 定义函数

      • 格式

        • function name ( [variable] ) { statements }
    • 使用函数

      • 格式
      gawk ' fuction   myfunction([variable])               
         {  statements   }            
          BEGIN{ myfunction() }'  file
      
posted @ 2022-10-17 23:49  Tjane'Blogs  阅读(86)  评论(0)    收藏  举报