awk教程

  • 定义

    简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
    awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。

  • 有三种方式调用awk

    1.命令行方式
    awk [-F  field-separator]  'commands'  input-file(s)
    其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
    在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
    
    2.shell脚本方式
    将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
    相当于shell脚本首行的:#!/bin/sh
    可以换成:#!/bin/awk
    
    3.将所有的awk命令插入一个单独文件,然后调用:
    awk -f awk-script-file input-file(s)
    其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
    
  • 例子

    1、demo.txt是awk所要处理的文本文件。前面单引号内部有一个大括号,里面就是每一行的处理动作print $0

    # 格式
    $ awk 动作 文件名
    
    # 示例
    $ awk '{print $0}' demo.txt
    

    2、我们先用标准输入(stdin)演示上面这个例子

    $ echo 'this is a test' | awk '{print $0}'
    this is a test
    

    3、awk会根据空格和制表符,将每一行分成若干字段,依次用$1、$2、$3代表第一个字段、第二个字段、第三个字段等等

    $ echo 'this is a test' | awk '{print $3}'
    a
    

    4、字段分隔符是冒号(:),所以要用-F参数指定分隔符为冒号。然后,才能提取到它的第一个字段

    root:x:0:0:root:/root:/usr/bin/zsh
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    sys:x:3:3:sys:/dev:/usr/sbin/nologin
    sync:x:4:65534:sync:/bin:/bin/sync
    
    $ awk -F ':' '{ print $1 }' demo.txt
    root
    daemon
    bin
    sys
    sync
    
    
  • 变量

    除了$ + 数字表示某个字段,awk还提供其他一些变量。
    变量NF表示当前行有多少个字段,因此$NF就代表最后一个字段

    $ echo 'this is a test' | awk '{print $NF}'
    test
    

    $(NF-1)代表倒数第二个字段

    $ awk -F ':' '{print $1, $(NF-1)}' demo.txt
    root /root
    daemon /usr/sbin
    bin /bin
    sys /dev
    sync /bin
    

    变量NR表示当前处理的是第几行,如果原样输出字符,要放在双引号里面

    $ awk -F ':' '{print NR ") " $1}' demo.txt
    1) root
    2) daemon
    3) bin
    4) sys
    5) sync
    

    awk的其他内置变量如下

    变量含义
    FILENAME当前文件名
    FS字段分隔符,默认是空格和制表符
    RS行分隔符,用于分割每一行,默认是换行符
    OFS输出字段的分隔符,用于打印时分隔字段,默认为空格
    ORS输出字段的分隔符,用于打印时分隔字段,默认为空格
    OFMT数字输出的格式,默认为%.6g
  • 函数

    函数toupper()用于将字符转为大写

    $ awk -F ':' '{ print toupper($1) }' demo.txt
    ROOT
    DAEMON
    BIN
    SYS
    SYNC
    

    常用的函数

    函数名含义
    tolower()字符转为小写
    length()返回字符串长度
    substr()返回子字符串
  • 条件

    awk允许指定输出条件,只输出符合条件的行。
    格式:

    $ awk '条件 动作' 文件名
    

    只输出包含usr的行

    $ awk -F ':' '/usr/ {print $1}' demo.txt
    root
    daemon
    bin
    sys
    
    # 输出奇数行
    $ awk -F ':' 'NR % 2 == 1 {print $1}' demo.txt
    root
    bin
    sync
    
    # 输出第三行以后的行
    $ awk -F ':' 'NR >3 {print $1}' demo.txt
    sys
    sync
    
    $ awk -F ':' '$1 == "root" {print $1}' demo.txt
    root
    
    $ awk -F ':' '$1 == "root" || $1 == "bin" {print $1}' demo.txt
    root
    bin
    
  • if语句

    awk提供了if结构,用于编写复杂的条件

    $ awk -F ':' '{if ($1 > "m") print $1}' demo.txt
    root
    sys
    sync
    

    if结构还可以指定else部分。

    $ awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo.txt
    root
    ---
    ---
    sys
    sync
    
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值