awk 的工作原理:

执行BEGIN{action;...}语句块中的语句。
从文件或标准输入(stdin)读取一行,然后执行pattern{action;...}语句块,它逐行扫描文件,从第一行到最后一行重复这一个过程,直到文件全部读取完毕。
当读至输入流末尾时,执行END{action;...}语句块。
BEGIN语句块在awk开始输入流中读取之前执行。这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可写在BEGIN语句块中。
END语句块在awk从输⼊流中读完所有的⾏之后被执⾏,⽐如打印所有⾏的分析结果这类信息汇总都是在END语句块中完成,它也是⼀个可选语句块。
pattern语句块中的通⽤命令是最重要的部分,也是可选的。如果没有提供attern语句块,则默认执⾏{print},即打印每⼀个读取到的⾏,awk读取的每⼀⾏都会执⾏该语句块。

注意:

逗号分隔符;
输出的各item可以是字符串,也可以是数值;当前记录的字段、变量或awk的表达式;
如省略item,相当于print $0.

awk基本用法:

-F:指明输⼊时⽤到的字段分隔符;
-v var=value:⾃定义变量。
  
eg:
    awk -F: '{print $1}' /etc/passde
    指定:未分隔符,打印每行记录的第一个字段即输出$1

awk 的变量用法

内置变量: FS:输出自动分隔符。默认空白字符 OFS:输出自动分隔符,默认空白字符 RS:输出记录分隔符,指定输入时的换行符,原换行符仍有效 ORS:输出记录分隔符,输出时用指定符号代替换行符 NF:字符数量 NR:行号 FNR:各文件分别计数,记录号; FILENAME:当前文件名; ARGC:命令行参数的个数 ARGV:数组,保存的时命令行所给定的各参数

eg:

输入字段分隔符FS:
    ~]# awk -v FS=':' '{print $1,FS,$3}' /etc/passwd
    root : 0
    bin : 1
    daemon : 2
    adm : 3
    lp : 4
    sync : 5
    ...
 输⼊出字段分隔符OFS
    ~]# awk -v FS=':' -v OFS='----' '{print $1,$3,$7}' /etc/passwd
    root----0----/bin/bash
    bin----1----/sbin/nologin
    daemon----2----/sbin/nologin
    adm----3----/sbin/nologin
    lp----4----/sbin/nologin
    sync----5----/bin/sync
    shutdown----6----/sbin/shutdown
    ...
输⼊记录分隔符RS
    ~]# head -1 /etc/passwd | awk -v RS=':' '{print}'
    root
    x
    0
    0
    root
    /root
    ...
输出记录分隔符ORS
    ~]# awk -v OR=' ' -v ORS='----' '{print}' /etc/passwd
     root:x:0:0:root:/root:/bin/bash----bin:x:1:1:bin:/bin:/sbin/nologin----
    daemon:x:2:2:daemon:/sbin:/sbin/nologin----adm:x:3:4:adm:/var/adm:/sbin/nologin--
    --lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin----
    ...
字段数量NF
    ~]#  awk -F: '{print NF}' /etc/passwd
    7
    7
    7
    7
    7
    ...
⾏号NR变量
    ~]#  awk -F: '{print NR,$1}' /etc/passwd
    1 root
    2 bin
    3 daemon
    4 adm
    5 lp
    6 sync
    7 shutdown
    ...
各⽂件分别的记录号FNR
     ~]#  awk '{print FNR,$1}' /etc/fstab /etc/passwd
     1 UUID=0c239cec-c2f7-49b6-9090-c1adf0f074cb
    2 /dev/mapper/vg_magedu-lv_root
    3 /dev/mapper/vg_magedu-lv_swap
    1 root:x:0:0:root:/root:/bin/bash
    2 bin:x:1:1:bin:/bin:/sbin/nologin
    3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4 adm:x:3:4:adm:/var/adm:/sbin/nologin
    ...
当前⽂件名FILENAME
     ~]#  awk '{print FILENAME,FNR,$1}' /etc/fstab /etc/passwd  
     /etc/fstab 1 UUID=0c239cec-c2f7-49b6-9090-c1adf0f074cb
    /etc/fstab 2 /dev/mapper/vg_magedu-lv_root
    /etc/fstab 3 /dev/mapper/vg_magedu-lv_swap
    /root/awktest.txt 1 root:x:0:0:root:/root:/bin/bash
    /root/awktest.txt 2 bin:x:1:1:bin:/bin:/sbin/nologin
    /root/awktest.txt 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    ...
命令⾏参数的个数ARGC
     ~]#  awk 'BEGIN {print ARGC}' /etc/fstab /etc/inittab 
     3
命令⾏给定的各参数的数组ARGV
    ~]#  awk 'BEGIN {print ARGV[1]}' /etc/fstab /etc/inittab
    /etc/fstab

awk 自定义变量

eg:

命令⾏给定的各参数的数组ARGV变量
    ~]#  awk -F: -v name='username:' '{print name,$1}' /etc/passwd
    username: root
    username: bin
    username: daemon
    username: adm
    ...

awk 的格式化输出

格式符:与item一一对应
    %c:显⽰字符的ASCII码;
    %d,%i:显⽰⼗进制整数;
    %e,%E:显⽰科学计数法数值;
    %f:显⽰为浮点数;
    %g,%G:以科学计数法或浮点形式显⽰数值;
    %s:显⽰字符串;
    %u:⽆符号整数;
    %%:显⽰%⾃⾝。
修饰符 :
    #[.#]:第⼀个#为数字控制显⽰的宽度,第⼆个#表⽰⼩数点后的精度,如%3.1f;
    -:左对齐(默认右对齐),如%-15s;
    +:显⽰数值的正负号,如%+d。

awk 的操作符

赋值操作符:
    =:右边赋值给左边;
    +=:先加,再赋值;
    -=:先减,再赋值;
    *=:先乘,再赋值;
    /=:先除,再赋值;
    %=:先取余,再赋值;
    ^=:先幂运算,再赋值;
    ++:递增操作;
    --:递减操作。
⽐较操作符:
    ==:判断相等;
    !=:判断不等;
    >:判断⼤于;
    >=:判断⼤于等于;
    <:判断⼩于;
    <=:判断⼩于等于。
模式匹配符:
    ~:左边是否和右边匹配包含;
    !~:是否不匹配。 
逻辑操作符:
    &&:逻辑与;
    ||:逻辑或;
    !:逻辑⾮。

共勉!