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