作用:按特定的条件过滤文件,以特定的格式输出文本
工作流程:
默认按照空白分隔符分割文本内容,内部有2变量用于标识分割的第一部分,第二部分;其中$0用于代表整行内容
支持通过-F选项指定分隔符
逐行处理工具
目录
awk [options] 'script' file1 file2
akw [options] 'pattern{action}' file1 file2
pattern:模式/条件
action:
printf
一、aciton操作
printf
1.print
[root@xtyw-master01 ~]# ifconfig ens192 | sed -n '2p' |awk '{print $2}'
192.168.11.42
[root@xtyw-master01 ~]# sed -n '1p' /shell/passwd |awk -F : '{print $1,$7}'
root /bin/bash
[root@xtyw-master01 ~]# sed -n '1p' /shell/passwd |awk -F : '{print "用户名:",$1
> }'
用户名: root
[root@xtyw-master01 ~]# sed -n '1p' /shell/passwd |awk -F : '{print "用户名:",$1}'
用户名: root
[root@xtyw-master01 ~]# sed -n '1p' /shell/passwd |awk -F : '{print "用户名:",$1,"shell名称:",$7}'
用户名: root shell名称: /bin/bash
2.printf
格式化输出内容
printf "内容",内容1,内容2,内容3
格式的写法:
占位符:
%s 字符串
%d 整数
%f 浮点数
注释:
printf默认没有换行,如果需要换行,手动添加\n
[root@xtyw-master01 ~]#
[root@xtyw-master01 ~]# awk 'BEGIN{printf "%s","hello"}'
hello[root@xtyw-master01 ~]#
[root@xtyw-master01 ~]# awk 'BEGIN{printf "%d",100}'
100[root@xtyw-master01 ~]# awk 'BEGIN{printf "%d",3.1415926}'
3[root@xtyw-master01 ~]# awk 'BEGIN{printf "%d\n",3.1415926}'
3
[root@xtyw-master01 ~]# awk 'BEGIN{printf "%f",3.1415926}'
3.141593[root@xtyw-master01 ~]#
%-10s
10:占十个字符的宽度
-:左对齐,默认右对齐
[root@xtyw-master01 ~]# awk 'BEGIN{printf "%10s\n","shell"}'
shell
[root@xtyw-master01 ~]# awk 'BEGIN{printf "%-10s\n","shell"}'
shell
[root@xtyw-master01 ~]# df -hT |grep "^/"|awk '{print "磁盘名称",$1,"挂载点",$7,"使用率",$6}'
磁盘名称 /dev/mapper/centos-root 挂载点 / 使用率 3%
磁盘名称 /dev/sda1 挂载点 /boot 使用率 30%
[root@xtyw-master01 ~]# df -hT |grep "^/"|awk '{printf "%-10s%-30s%-10s%-10s%-10s%-10s\n","磁盘名称",$1,"挂载点",$7,"使用率",$6}'
磁盘名称 /dev/mapper/centos-root 挂载点 / 使用率 3%
磁盘名称 /dev/sda1 挂载点 /boot 使用率 30%
二、变量的引用
用户自定义变量
内置变量
1、用户自定义变量
1)定义变量
1)-v选项
-v 变量名称=值
2)BEGIN{}模式中定义
变量名称=值
2)调用变量
变量名称
[root@xtyw-master01 ~]# awk -v name="cow" 'BEGIN{print "名称:",name}'
名称: cow
[root@xtyw-master01 ~]# awk -v name="cow" -v age=18 'BEGIN{print "名称:",name,"年龄:",age}'
名称: cow 年龄: 18
[root@xtyw-master01 ~]# awk 'BEGIN{name="sheep";print name}'
sheep
2、内置变量
FS
用于定义分隔符,默认空白字符
[root@xtyw-master01 ~]# sed -n '1p' /shell/passwd | awk -v FS=":" '{print $1}'
root
OFS
用于定义akw输出多段内容的分隔符,默认空白字符
[root@xtyw-master01 ~]# sed -n '1p' /shell/passwd | awk -v FS=":" -v OFS="-->" '{print $1,$2,$3}'
root-->x-->0
RS
用于定义awk读取多行内容时的行分隔符,默认换行符
[root@xtyw-master01 ~]# sed -n '1,2p' /shell/passwd |awk -v RS=":" -v OFS="-->" '{print $0}'
root
x
0
0
root
/root
/bin/bash
bin
x
1
1
bin
/bin
/sbin/nologin
ORS
用于定义awk输出多行内容时的行分隔符,默认换行符
[root@xtyw-master01 ~]# sed -n '1,2p' /etc/passwd | awk -v ORS="--->" -v F=":" '{print $1}'
root:x:0:0:root:/root:/bin/bash--->bin:x:1:1:bin:/bin:/sbin/nologin--->[root@xtyw-master01 ~]#
NR
用于记录行号,处理多个文件,行号连续记录
FNR
用于记录行号,处理多个文件,行号单独记录
[root@xtyw-master01 ~]# awk '{print NR}' /etc/hosts /shell/fstab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@xtyw-master01 ~]# awk '{print FNR}' /etc/hosts /shell/fstab
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
9
10
11
[root@xtyw-master01 ~]# awk 'NR==3{print $0}' /etc/fstab
# /etc/fstab
NF
记录awk分割文件时,每行内容被分割的段数
[root@xtyw-master01 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 16G 0 16G 0% /dev
tmpfs tmpfs 16G 0 16G 0% /dev/shm
tmpfs tmpfs 16G 1.7G 15G 11% /run
tmpfs tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 483G 13G 471G 3% /
/dev/sda1 xfs 1014M 298M 717M 30% /boot
tmpfs tmpfs 3.2G 12K 3.2G 1% /run/user/42
tmpfs tmpfs 3.2G 0 3.2G 0% /run/user/0
[root@xtyw-master01 ~]# df -hT | awk '{print NF}'
7
7
7
7
7
7
7
7
7
[root@xtyw-master01 ~]# df -hT | awk '{print $NF}'
挂载点
/dev
/dev/shm
/run
/sys/fs/cgroup
/
/boot
/run/user/42
/run/user/0
[root@xtyw-master01 ~]# netstat -antp | awk '{print NF,$NF}'
6 established)
10 name
8 root@pts/
8 master
7 910/rpcbind
7 1620/dnsmasq
7 1265/sshd
7 1259/cupsd
7 1581/master
8 root@pts/
8 root@pts/
7 910/rpcbind
7 1265/sshd
7 1259/cupsd
7 1581/master
三、pattern写法
1) 数字表达式
+,-,*,/,%
++ , --
+ =
2) 字符表达式
+ 拼接
"ab" + "cd" = abcd
3) 比较表达式
==,!=,>,>= , <, <=
字符 ~正则表达式
字符!~正则表达式
4) 逻辑表达式
&& 并且
|| 或者
[root@xtyw-master01 ~]# awk -F : '$3>1000{print $1}' /etc/passwd
nfsnobody
[root@xtyw-master01 ~]# awk -F : '$3>=1 && $3<=99{print$1}' /etc/passwd
bin
daemon
adm
lp
sync
shutdown
[root@xtyw-master01 ~]# netstat -antp |sed '1,2d' |awk '$6=="LISTEN"{print $0}'
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 718/sshd: root@pts/
tcp 0 0 0.0.0.0:16443 0.0.0.0:* LISTEN 1316/nginx: master
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 910/rpcbind
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1620/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1265/sshd
[root@xtyw-master01 ~]# df -hT |sed -n '/^//p'
/dev/mapper/centos-root xfs 483G 13G 471G 3% /
/dev/sda1 xfs 1014M 298M 717M 30% /boot
[root@xtyw-master01 ~]# df -hT |sed -n '/^//p' |awk '+$5>500{print "磁盘名称:",$1}'
磁盘名称: /dev/sda1
[root@xtyw-master01 ~]# awk -F : '$7 ~ "nologin$"{print "用户名:",$1,"sh名称",$7}' /etc/passwd
用户名: bin sh名称 /sbin/nologin
用户名: daemon sh名称 /sbin/nologin
用户名: adm sh名称 /sbin/nologin
用户名: lp sh名称 /sbin/nologin
用户名: mail sh名称 /sbin/nologin
用户名: operator sh名称 /sbin/nologin
2、 / 正则表达式 /
[root@xtyw-master01 ~]# netstat -antp | awk '/^tcp/{print $0}'
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 718/sshd: root@pts/
tcp 0 0 0.0.0.0:16443 0.0.0.0:* LISTEN 1316/nginx: master
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 910/rpcbind
[root@xtyw-master01 ~]# awk -F: '/nologin$/{print $1}' /etc/passwd
bin
daemon
adm
lp
mail
operator
games
ftp
nobody
[root@xtyw-master01 ~]# awk -F: '/^(r|s)/{print $1}' /etc/passwd
root
sync
shutdown
systemd-network
rpc
saned
saslauth
3、/正则表达式1/,/正则表达式2/
[root@xtyw-master01 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Jul 16 17:07:57 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=6dcbb55d-59a5-47a0-a097-c35d94894d14 /boot xfs defaults 0 0
#/dev/mapper/centos-swap swap swap defaults 0 0
[root@xtyw-master01 ~]# awk '/etc/,/dev/{print $0}' /etc/fstab
# /etc/fstab
# Created by anaconda on Fri Jul 16 17:07:57 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
4、BEGIN{}
在处理文本数据之前,执行操作
[root@xtyw-master01 ~]# sed -n '1,3p' /etc/passwd | awk -F: 'BEGIN{printf "\n"}{print $1,$7}'
---开始---
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
5、END{}
在文本处理数据之后,执行的操作
[root@xtyw-master01 ~]# sed -n '1,3p' /etc/passwd | awk -F: 'BEGIN{printf "---开始---\n"}{print $1,$7}END{printf "---结束---"}'
---开始---
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
---结束---
四、逻辑控制语句
1、条件判断语法
if (条件) {条件为真的操作}
if(条件){条件为真的操作} else{天剑为假的操作}
if (条件){条件为真的操作} else if (条件2){条件为真的操作}
[root@xtyw-master01 ~]# awk -F : '{if($3==0){print $1,"是管理员"}else{print $1,"是普通用户"}}' /etc/passwd | sed -n '1,5p'
root 是管理员
bin 是普通用户
daemon 是普通用户
adm 是普通用户
lp 是普通用户
[root@xtyw-master01 ~]# awk -F : -v bash_nu=0 -v nolo_nu=0 '{if($7=="/bin/bash"){bash_nu++}else if($7=="/sbin/nologin"){nolo_nu++}}END{print "bash个数:",bash_nu,"nolo个数:",nolo_nu}' /etc/passwd
bash个数: 2 nolo个数: 40
[root@xtyw-master01 ~]# netstat -antp |awk -v nu=0 '{if($6=="LISTEN"){nu++}}END{print "Listen个数:",nu}'
Listen个数: 14
[root@xtyw-master01 ~]#
[root@xtyw-master01 ~]# df -hT |awk '/^//{if(+$6>10){print $1,$NF,$6}}'
/dev/sda1 /boot 30%
2、循环
for(变量;循环条件;改变循环条件的语句){语句;语句;...}
continue
break
[root@xtyw-master01 ~]# sed -n '1,2p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@xtyw-master01 ~]# sed -n '1,2p' /etc/passwd| awk -F: '{for(i=1;i<=7;i++){if(length($i)>4){print $i}}}'/root
/bin/bash
/sbin/nologin
五、数组
定义数组,在计算机内存中开辟一段连续的空间
1、定义数组
[root@xtyw-master01 ~]# awk 'BEGIN{cow[1]="1.1";cow[2]="1.2";cow[3]="1.3"}'
[root@xtyw-master01 ~]#
2、获取单个数据
[root@xtyw-master01 ~]# awk 'BEGIN{cow[1]="1.1";cow[2]="1.2";cow[3]="1.3";print cow[2]}'
1.2
[root@xtyw-master01 ~]# awk 'BEGIN{cow[1]="1.1";cow[2]="1.2";cow[3]="1.3";print cow[3]}'
1.3
[root@xtyw-master01 ~]#
3、获取数组中的所有数据
[root@xtyw-master01 ~]# awk 'BEGIN{cow[1]="1.1";cow[2]="1.2";cow[3]="1.3";for(i=1;i<=3;i++){print cow[i]}}'
1.1
1.2
1.3
[root@xtyw-master01 ~]# awk 'BEGIN{cow[1]="1.1";cow[2]="1.2";cow[3]="1.3";for(i=1;i<=length(cow);i++){print cow[i]}}'
1.1
1.2
1.3
4、数组支持以任何形式数据作为下标使用
[root@xtyw-master01 ~]# awk 'BEGIN{test["one"]="mouse";test["two"]="cow";test["three"]="tiger";for(i in test){print i}}'
three
two
one
[root@xtyw-master01 ~]# awk 'BEGIN{test["one"]="mouse";test["two"]="cow";test["three"]="tiger";for(i in test){print test[1]}}'
[root@xtyw-master01 ~]# awk 'BEGIN{test["one"]="mouse";test["two"]="cow";test["three"]="tiger";for(i in test){print i,test[1]}}'
three
two
one
[root@xtyw-master01 ~]# awk 'BEGIN{test["one"]="mouse";test["two"]="cow";test["three"]="tiger";for(i in test){print i,test[i]}}'
three tiger
two cow
one mouse
六、awk内置函数
1、length()
获取字符串的长度
[root@m1 ~]# awk 'BEGIN{print length("abcd")}'
4
2、int()
返回整数
[root@xtyw-master01 ~]# awk 'BEGIN{printf int(13.2)}'
13[root@xtyw-master01 ~]#
3、index()返回字符所在的字符串的位置
[root@m1 ~]# awk 'BEGIN{print index("abcd","b")}'
2
4、substr(string,start[,length])
取string字符串中的子串,从start开始,取length个;start从1开始计数
[root@m1 ~]# awk 'BEGIN{str="abc abc abc";print substr(str,2,5)}'
bc ab