awk命令详解:
可以实现下面功能:
文本处理
输出格式化的文本报表
执行算术运算
执行字符串操作
格式:
awk [options] 'program' var=value file...
awk [options] -f programfile var=value file...
说明:
program通常是放在单引号中,并可以由三种部分组成
BEGIN语句块
模式匹配的通用语句块
END语句块
常见选项:
-F ”分隔符“指明输入时用到的字段分隔符
-v var=value 变量赋值
Program格式:
pattern{action statements;...}
pattern:决定动作语句何时触发及触发事件,比如:BEGIN,END
action statements:对数据进行处理,放在{}内指明,常见:print,printf
动作 print
格式:
print item1,item2,...
说明:
逗号分隔符
输出item可以是字符串,也可以是数值;当前记录的字段、变量或awk的表达式
如省略item,相当于print $0
范例:
[root@centos8 ~]#awk '{print "hello,awk"}'
[root@centos8 ~]#awk -F: '{print "wang"}' /etc/passwd
[root@centos8 ~]#awk -F: '{print}' /etc/passwd
[root@centos8 ~]#awk -F: '{print $0}' /etc/passwd
[root@centos8 ~]#awk -F: '{print $1,$3}' /etc/passwd
[root@centos8 ~]#awk -F: '{print $1"\t"$3}' /etc/passwd
[root@centos8 ~]#grep "^UUID" /etc/fstab |awk {'print $2,$3'} / xfs
awk变量:
分为内置变量和自定义变量
常见的内置变量:FS、OFS、RS、ORS、NF、NR、FNR、FILENAME、ARGC、ARGV
FS:输入字段分隔符,默认为空白字符,功能相当于-F
范例:
awk -v FS=':' '{print $1,FS,$3}' /etc/passwd
awk -v FS=":" '{print $1FS$3}' /etc/passwd
awk –F: '{print $1,$3,$7}' /etc/passwd
S=:;awk -v FS=$S '{print $1FS$3}' /etc/passwd
OFS:输出字段分隔符,默认为空白字符
范例:
awk -v FS=':' -v OFS=':' '{print $1,$3,$7}' /etc/passwd
RS:输入记录分隔符,指定输入时的换行符
范例:
awk -v RS=' ' ‘{print }’ /etc/passwd
ORS:输出记录分隔符,输出时用指定符号代替换行符
范例:
awk -v RS=' ' -v ORS='###' '{print $0}' /etc/passwd
NF:字段数量
范例:
#引用变量时,变量前不需加$
[root@centos8 ~]#awk -F:'{print NF}' /etc/fstab
[root@centos8 ~]#awk -F:'{print $(NF-1)}' /etc/passwd
[root@centos8 ~]#ls /misc/cd/BaseOS/Packages/*.rpm |awk -F"." '{print $(NF1)}'|sort |uniq -c 3
89 i686
208 noarch
1060 x86_64
[root@centos8 ~]#ss -nt |grep "^ESTAB" | awk -F"[[:space:]]+|:" '{print $(NF2)}'
10.0.0.1
10.0.0.7
10.0.0.1
[root@centos8 ~]#ss -nt |awk -F"[[:space:]]+|:" '/^ESTAB/{print $(NF-2)}'
NR:记录编号
范例:
[root@centos8 ~]#awk -F: '{print NR}' /etc/passwd
1
2
3
.......
[root@centos8 ~]#awk -F: 'END{print NR}' /etc/passwd
57
[root@centos8 ~]#awk -F: 'BEGIN{print NR}' /etc/passwd
0
FNR:各文件分别计数,记录号
范例:
awk '{print FNR}' /etc/fstab /etc/inittab
[root@centos8 ~]#awk '{print NR,$0}' /etc/issue /etc/redhat-release
1 \S
2 Kernel \r on an \m
3
4 CentOS Linux release 8.0.1905 (Core)
[root@centos8 script40]#awk '{print FNR,$0}' /etc/issue /etc/redhat-release
1 \S
2 Kernel \r on an \m
3
1 CentOS Linux release 8.0.1905 (Core)
[14:56:21 root@centos8 ~]# awk '{print NR}' /etc/issue /etc/redhat-release
1
2
3
4
[15:15:22 root@centos8 ~]# awk '{print FNR}' /etc/issue /etc/redhat-release
1
2
3
1
FILENAME:当前文件名
范例:
[15:18:41 root@centos8 ~]# awk '{print FNR,FILENAME,$0}' /etc/issue /etc/redhat-release
1 /etc/issue \S
2 /etc/issue Kernel \r on an \m
3 /etc/issue
1 /etc/redhat-release CentOS Linux release 8.0.1905 (Core)
ARGC:命令行参数的个数
范例:
[15:25:14 root@centos8 ~]# awk '{print ARGC}' /etc/issue /etc/redhat-release
3
3
3
3
[15:25:29 root@centos8 ~]# awk 'BEGIN{print ARGC}' /etc/issue /etc/redhat-release
3
ARGV:数组,保存的是命令行所给定的各参数
范例:
[15:25:34 root@centos8 ~]# awk 'BEGIN{print ARGV[0]}' /etc/issue /etc/redhat-release
awk
[15:29:58 root@centos8 ~]# awk 'BEGIN{print ARGV[1]}' /etc/issue /etc/redhat-release
/etc/issue
[15:30:31 root@centos8 ~]# awk 'BEGIN{print ARGV[2]}' /etc/issue /etc/redhat-release
/etc/redhat-release
[15:30:40 root@centos8 ~]# awk 'BEGIN{print ARGV[3]}' /etc/issue /etc/redhat-release
动作 printf:
printf可以实现格式化输出:
格式:
printf "FORMAT" , item1 , item2, ...
说明:
必须指定FORMAT
不会自动换行,需要显示给出换行控制符,\n
FORMAT中需要分别为后面每个item指定格式符
格式符:与item——对应
%c:显示字符的ASCII码
%d,%i:显示十进制整数
%e,%E:显示科学计数法数值
%f:显示为浮点数
%g,%G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%自身
修饰符:
#[.#] 第一个数字控制显示的宽度;第二个#表示小数点后精度,如:%3.1f
- 左对齐(默认为右对齐) 如:%-15s
+ 显示数值的正负符号 如:%+d