• awk的简单使用


    awk是什么?

    AWK 作为三剑客之一,是一种处理文本文件的语言,是一个强大的文本分析工具。awk可以把文件逐行读入,然后以设置的分隔符(默认为空格), 切开的部分再进行各种分析处理。
    之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

    awk的语法

    awk [选项参数] 'script' var=value file(s)
    或
    awk [选项参数] -f scriptfile var=value file(s)
    
    • 1
    • 2
    • 3

    其中script以pattern+action组成,并且awk中还可以使用变量以及控制语句进行高级的处理,具体而言(选项参数见)1

    awk '{pattern + action}' {filenames}   #行匹配语句 awk '' 只能用单引号
    
    • 1
    • pattern是awk在数据中查找的内容
    • action是找到匹配内容后的操作
    • filenames表示处理的文件

    下图描述了 AWK 的工作流程:

    Created with Raphaël 2.3.0 开始 执行BEGIN程序块 从文件流中读取一行 在该行中指定awk的命令 是否到达文件末尾? 执行END程序块 yes no

    BEGIN和END是两个特殊的模式,不属于常规的(pattern), 它们是用来在awk程序执行之前或之后执行特定的操作的语句块。

    • BEGIN块:在awk程序执行之前,会先执行BEGIN语句块中的代码。通常在BEGIN语句块中进行一些初始化的操作,例如设置变量的初始值、打印程序的头部信息等。
    • END块:在awk程序执行完后,会执行END语句块中的代码。通常在END语句中执行一些总结性的操作,例如统计计算结果,打印最终的输出信息等。

    这两个语句块的位置是固定的,可以在awk程序中只出现一次,并且不需要与其他的模式进行匹配。

    大致为:

    awk 'BEGIN {print "开始处理数据"} {total += $1 } END {print "处理完成, 总和为: "total}' data.txt
    
    • 1

    awk内置变量

    awk有很多内置变量用来设置环境信息,这些变量都是可以直接使用的

    ARGC 命令行参数个数
    ARGV 命令行参数排列
    ENVIRON 支持队列中系统环境变量的使用
    FILENAME awk浏览的文件名
    FNR 浏览文件的记录数
    FS 设置输入域分隔符,等价于命令行 -F选项
    NF 浏览记录的域的个数
    NR 已读的记录数
    OFS 输出域分隔符
    ORS 输出记录分隔符
    RS 控制记录分隔符
    $0 整条记录。
    $1 表示当前行的第一个域
    $2 表示当前行的第二个域
    $n 当前行的第n个域

    例子

    awk输出第一列

    cat /etc/passwd | awk -F : '{print $1}'

    计算有多少行…

    cat test | awk 'BEGIN {a=0} {a+=1} END {print a}'

    计算带以wp开头的行有多少

    cat test | awk 'BEGIN {a=0} /wp/{a+=1} END {print a}'

    分别计算带wp开头的行和以mask开头的行有多少

    cat test | awk 'BEGIN {a=0;b=0} /^wp/{a+=1} /^mask/{b+=1} END {print "wp:"a "mask"b}
    
    • 1

    重点就是pattern的使用,你可以发现就是不断的pattern然后处理

    awk删除第一列

    gl | awk '{$1="";print $0}'
    gl | awk '{for (i=2;i printf没有回车

    最后一列为2的行,第三列+3,不为2的行,直接输出

    awk -F , '$7==2 {$3=$3+3; OFS=",";print $0} $7 !=2 {print $0;OFS=","}' 2PeopleMoving12.csv > test.csv


    1. 选项参数说明:
      -F fs or --field-separator fs
      指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
      -v var=value or --asign var=value
      赋值一个用户定义变量。
      -f scripfile or --file scriptfile
      从脚本文件中读取awk命令。
      -mf nnn and -mr nnn
      对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
      -W compact or --compat, -W traditional or --traditional
      在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
      -W copyleft or --copyleft, -W copyright or --copyright
      打印简短的版权信息。
      -W help or --help, -W usage or --usage
      打印全部awk选项和每个选项的简短说明。
      -W lint or --lint
      打印不能向传统unix平台移植的结构的警告。
      -W lint-old or --lint-old
      打印关于不能向传统unix平台移植的结构的警告。
      -W posix
      打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符=不能代替=;fflush无效。
      -W re-interval or --re-inerval
      允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
      -W source program-text or --source program-text
      使用program-text作为源代码,可与-f命令混用。
      -W version or --version
      打印bug报告信息的版本。 ↩︎

  • 相关阅读:
    网络编程--高并发服务器(二)
    linux部署docker【centos】
    nodemailer学习
    机器人过程自动化(RPA)入门 7. 处理用户事件和助手机器人
    iOS弱引用
    面试:关于static静态变量的问题
    bootstrap-select js jQuery控制select属性变化
    【HarmonyOS】遇见的问题汇总
    webpack 静态资源文件加载(assets)
    1855. 下标对中的最大距离
  • 原文地址:https://blog.csdn.net/qq_37429313/article/details/128330856