一、awk介绍
1、awk是一种强大的文本处理工具,用于从输入文本中提取信息、进行格式化输出以及执行其他文本处理任务。它是一种类似于编程语言的工具,具有灵活的语法和丰富的功能,通常用于处理结构化文本数据,如日志文件、表格数据等。
2、awk的语法
awk 'pattern {action}' file
pattern
:用于匹配输入的条件。{ actions }
:与模式匹配时执行的操作。input_file
:要处理的输入文件。
二、awk的使用
1、awk打印所有的行
awk '{print $0}' 1.txt
# 创建并写入以下文本内容
root@VM-12-3-ubuntu:~# cat 1.txt
zhangsan 30 100
lisi 20 300
wangwu 18 500
luban 15 30
root@VM-12-3-ubuntu:~# awk '{print $0}' 1.txt
zhangsan 30 100
lisi 20 300
wangwu 18 500
luban 15 30
root@VM-12-3-ubuntu:~#
2、awk打印第一列
awk '{print $1}' 1.txt
# 打印第一列
root@VM-12-3-ubuntu:~# awk '{print $1}' 1.txt
zhangsan
lisi
wangwu
luban
root@VM-12-3-ubuntu:~#
3、awk打印某行某列
# 打印第一行,第一列
root@VM-12-3-ubuntu:~# awk 'NR==1 {print $1}' 1.txt
zhangsan
# 打印第三行,第一列
root@VM-12-3-ubuntu:~# awk 'NR==3 {print $1}' 1.txt
wangwu
# 打印第二行,第二列
root@VM-12-3-ubuntu:~# awk 'NR==2 {print $2}' 1.txt
20
4、awk计算第二列总和
awk '{sum += $2} END {print sum}' 1.txt
root@VM-12-3-ubuntu:~# cat 1.txt
zhangsan 30 100
lisi 20 300
wangwu 18 500
luban 15 30
root@VM-12-3-ubuntu:~# awk '{sum += $2} END {print sum}' 1.txt
83
root@VM-12-3-ubuntu:~#
# 可以将输出结果自定义,如下
root@VM-12-3-ubuntu:~# awk '{sum += $2} END {print "sum: " sum}' 1.txt
sum: 83
root@VM-12-3-ubuntu:~#
5、awk打印第二列大于20的行
awk '$2 > 20 {print $0}' 1.txt
root@VM-12-3-ubuntu:~# awk '$2 > 20 {print $0}' 1.txt
zhangsan 30 100
root@VM-12-3-ubuntu:~#
如果需要打印对应列,只需要改$2就行
6、awk修改分隔符为逗号,并打印第一列和第二列
awk -F' ' '{print $1 "," $2}' 1.txt
root@VM-12-3-ubuntu:~# awk -F' ' '{print $1 "," $2}' 1.txt
zhangsan,30
lisi,20
wangwu,18
luban,15
# 打印第一、二、三列
root@VM-12-3-ubuntu:~# awk -F' ' '{print $1 "," $2 "," $3}' 1.txt
zhangsan,30,100
lisi,20,300
wangwu,18,500
luban,15,30
# 打印第一、二、三列,并在第二列和第三列之间使用:分隔符
root@VM-12-3-ubuntu:~# awk -F' ' '{print $1 "," $2 ":" $3}' 1.txt
zhangsan,30:100
lisi,20:300
wangwu,18:500
luban,15:30
root@VM-12-3-ubuntu:~#
7、awk添加行号到每一行
awk '{print NR, $0}' 1.txt
root@VM-12-3-ubuntu:~# cat 1.txt
zhangsan 30 100
lisi 20 300
wangwu 18 500
luban 15 30
# 添加行号后
root@VM-12-3-ubuntu:~# awk '{print NR, $0}' 1.txt
1 zhangsan 30 100
2 lisi 20 300
3 wangwu 18 500
4 luban 15 30
root@VM-12-3-ubuntu:~#
8、awk如何自定义输出结果
自定义输出两列结果
awk '{printf "Name: %s, Age: %d\n", $1, $2}' 1.txt
自定义输出三列结果
awk '{printf "Name: %s, Age: %d, Column3: %s\n", $1, $2, $3}' 1.txt
解释:
- %s:用来打印字符串类型的字段。
- %d:用来打印整数类型的字段。
在这个例子中,假设 1.txt包含三列,每列由空格分隔。$1
表示第一列,$2
表示第二列,$3
表示第三列。printf
语句中的格式控制字符串中增加了一个 %s
来打印第三列的内容。
root@VM-12-3-ubuntu:~# awk '{printf "Name: %s, Age: %d\n", $1, $2}' 1.txt
Name: zhangsan, Age: 30
Name: lisi, Age: 20
Name: wangwu, Age: 18
Name: luban, Age: 15
# 将三列都自定义命名输出
root@VM-12-3-ubuntu:~# awk '{printf "Name: %s, Age: %d, money: %s\n", $1, $2, $3}' 1.txt
Name: zhangsan, Age: 30, money: 100
Name: lisi, Age: 20, money: 300
Name: wangwu, Age: 18, money: 500
Name: luban, Age: 15, money: 30
root@VM-12-3-ubuntu:~#
三、awk通用命令
1、统计普通用户和虚拟用户数量
# 统计普通用户
root@VM-12-3-ubuntu:~# awk '$NF~/bash/{i=i+1}END{print i}' /etc/passwd
3
# 统计虚拟用户
root@VM-12-3-ubuntu:~# awk '$NF!~/bash/{i=i+1}END{print i}' /etc/passwd
52
2、求和运算
sum=sum+$n(需要进行数值求和的列)
root@VM-12-3-ubuntu:~# seq 10|awk '{sum=sum+$1;print sum}'
1
3
6
10
15
21
28
36
45
55
root@VM-12-3-ubuntu:~#
3、统计行数、单词数和字符数
root@VM-12-3-ubuntu:~# awk '{ nlines++; nwords += NF; nchars += length($0) + 1 } END { print nlines, nwords, nchars }' 1.txt
4 12 55
root@VM-12-3-ubuntu:~#
4、查找某行某列最大值和最小值
# 查找第二列的最大值
root@VM-12-3-ubuntu:~# awk 'NR==1 || $2 > max {max=$2} END {print "Max:", max}' 1.txt
Max: 30
# 查找第三列的最小值
root@VM-12-3-ubuntu:~# awk 'NR==1 || $3 < min {min=$3} END {print "Min:", min}' 1.txt
Min: 30
root@VM-12-3-ubuntu:~#
5、 计算某列的平均值
# 计算第三列的平均值
root@VM-12-3-ubuntu:~# awk '{sum += $3} END {print "Average:", sum/NR}' 1.txt
Average: 232.5
root@VM-12-3-ubuntu:~#
6、如何获取IP地址
# 如果需要获取其他网卡ip地址,只需要将lo 改成对应的网卡名
root@VM-12-3-ubuntu:~# ip addr show lo | awk '/inet /{print $2}'
127.0.0.1/8
root@VM-12-3-ubuntu:~#