文本处理三剑客之awk命令

2019-07-06 0 条评论 463 次阅读 0 人点赞

awk是一种处理文本文件的语言,是一个强大的文本分析工具,名字来源于其三位创始人:Alfred Aho、Peter Weinberger和Brian Kernighan的Family Name的首字母,与grepsed合称文本处理三剑客。

用法:awk [options] 'pattern{action}' file

描述:逐行处理,默认以“换行符”为标记识别每一行,以用户指定的“分隔符”将行内容分割成字段,字段按照顺序,分别对应awk的内置变量中($1,$2,$3......),默认“分隔符”为空格,$0 表示整行


内置变量

FS:输入字段分隔符,默认为空白字符
OFS:输出字段分隔符,默认为空白字符
RS:输入记录分隔符(输入换行符),指定输入时的换行符
ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NF:当前行的字段的个数(即当前行被分割成了几列),字段数量
NR:行号,当前处理的文本行的行号
FNR:各文件分别计数的行号
FILENAME:当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数
自定义变量:1、[option]位置 -v var=value 2、{action}位置 { var1 = value1;var2=value2;print.....}


Pattern

1、空模式
2、关系运算符模式: <,>,<=,>=,==,!=,~pattern(匹配正则为真),!~pattern(不匹配正则为真)
3、BEGIN/END模式
4、正则模式: awk '/正则表达式/{Action}' file
5、行范围模式:awk '/正则1/,/正则2/{Action}' file

ps: 1、Program中使用的是扩展正则表达式;2、当使用{x,y}这种次数匹配的正则表达式时,需要配合--posix选项或者--re-interval选项


Action

  • print 和 printf:
    printf动作与printf命令的区别:

    1. printf动作与需要格式化输出的文本字段之间需要用“,”隔开,printf命令不需要;
    2. printf命令只有一个“格式替换符”时,格式化输出的多个文本字段可以重复匹配使用这个“格式替换符”,printf动作需要相应个数的“格式替换符”
  • awk [option] '{if (条件1){动作1}elif(条件2){动作2}else{动作3}}' file
  • awk 'BEGIN{for(i=1;i<=6;i++){print i}}'
  • awk -v i=1 'BEGIN{while(i<=5){print i ; i++}}'
    或 awk 'BEGIN{i=1;while(i<=5){print i; i++}}'
    或 awk BEGIN{i=1;do{print i; i++}while(i<=5)}'
  • continue、break、next、exit

数组

  • awk中数组的下标默认从1开始
  • awk中允许数组的值为空,在引用了数组中一个不存在的元素后,数组会自动创建一个该元素,并将其赋值为空。
  • 判断数组是否有某个下标的元素存在与否时,不应该用vars[N]=="",而应该用if(N in vars){action}else{action}这种方法
  • 数组的下标不仅可以为“数字”,也可以为任意“字符串”
  • awk '{for(i=1;i<=NF;i++) {count[$i]++}}END{for(j in count){print j,count[j]}}' test

内置函数

  • 算数函数:rand、srand、int
    awk 'BEGIN{srand();print int(rand()*1000)}'
  • 字符串函数:
    sub("查找字符","替换为字符","字段")
    gsub,
    length("字段"),
    index("字符","字段")
    split("字符串","数组","分隔符") (split函数有返回值,值就是数组长度)
  • 其他函数:
    asort(数组,\新数组)(不添加新数组的方式对asort函数对数组排序后,数组下标会被重置为数字,从1开始)
    asorti(数组,新数组)(对数组下标进行排序,生成一个下标组成的新数组)

  • 三元运算符:
    判断条件?Action1:action2

  • 打印奇数行:
    awk i=!i file

once

这个人太懒什么东西都没留下

文章评论(0)