执行BEGIN{action;...}语句块中的语句。 从文件或标准输入(stdin)读取一行,而后执行pattern{action;...}语句块,它逐行扫描文件,从第一行到最后一行重复这一个过程,直到文件所有读取完毕。 当读至输入流末尾时,执行END{action;...}语句块。 BEGIN语句块在awk开始输入流中读取以前执行。这是一个可选的语句块,好比变量初始化、打印输出表格的表头等语句一般可写在BEGIN语句块中。 END语句块在awk从输⼊流中读完全部的⾏以后被执⾏,⽐如打印全部⾏的分析结果这类信息汇总都是在END语句块中完成,它也是⼀个可选语句块。 pattern语句块中的通⽤命令是最重要的部分,也是可选的。若是没有提供attern语句块,则默认执⾏{print},即打印每⼀个读取到的⾏,awk读取的每⼀⾏都会执⾏该语句块。
逗号分隔符; 输出的各item能够是字符串,也能够是数值;当前记录的字段、变量或awk的表达式; 如省略item,至关于print $0.
-F:指明输⼊时⽤到的字段分隔符; -v var=value:⾃定义变量。 eg: awk -F: '{print $1}' /etc/passde 指定:未分隔符,打印每行记录的第一个字段即输出$1
内置变量:
FS:输出自动分隔符。默认空白字符
OFS:输出自动分隔符,默认空白字符
RS:输出记录分隔符,指定输入时的换行符,原换行符仍有效
ORS:输出记录分隔符,输出时用指定符号代替换行符
NF:字符数量
NR:行号
FNR:各文件分别计数,记录号;
FILENAME:当前文件名;
ARGC:命令行参数的个数
ARGV:数组,保存的时命令行所给定的各参数数组
eg:bash
输入字段分隔符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
eg: app
命令⾏给定的各参数的数组ARGV变量 ~]# awk -F: -v name='username:' '{print name,$1}' /etc/passwd username: root username: bin username: daemon username: adm ...
格式符:与item一一对应 %c:显⽰字符的ASCII码; %d,%i:显⽰⼗进制整数; %e,%E:显⽰科学计数法数值; %f:显⽰为浮点数; %g,%G:以科学计数法或浮点形式显⽰数值; %s:显⽰字符串; %u:⽆符号整数; %%:显⽰%⾃⾝。 修饰符 : #[.#]:第⼀个#为数字控制显⽰的宽度,第⼆个#表⽰⼩数点后的精度,如%3.1f; -:左对齐(默认右对齐),如%-15s; +:显⽰数值的正负号,如%+d。
赋值操做符: =:右边赋值给左边; +=:先加,再赋值; -=:先减,再赋值; *=:先乘,再赋值; /=:先除,再赋值; %=:先取余,再赋值; ^=:先幂运算,再赋值; ++:递增操做; --:递减操做。 ⽐较操做符: ==:判断相等; !=:判断不等; >:判断⼤于; >=:判断⼤于等于; <:判断⼩于; <=:判断⼩于等于。 模式匹配符: ~:左边是否和右边匹配包含; !~:是否不匹配。 逻辑操做符: &&:逻辑与; ||:逻辑或; !:逻辑⾮。