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 的操作符
赋值操作符:
=:右边赋值给左边;
+=:先加,再赋值;
-=:先减,再赋值;
*=:先乘,再赋值;
/=:先除,再赋值;
%=:先取余,再赋值;
^=:先幂运算,再赋值;
++:递增操作;
--:递减操作。
?较操作符:
==:判断相等;
!=:判断不等;
>:判断?于;
>=:判断?于等于;
<:判断?于;
<=:判断?于等于。
模式匹配符:
~:左边是否和右边匹配包含;
!~:是否不匹配。
逻辑操作符:
&&:逻辑与;
||:逻辑或;
!:逻辑?。
共勉!
原文地址:https://blog.51cto.com/14234169/2378494
时间: 2024-10-17 06:25:47