Linux中awk命令的使用

本文详细介绍了awk工具的基本概念、语法以及各种用法,包括基本的行和列操作、条件过滤、求和、计数、格式化输出、IP地址提取等,展示了awk在处理结构化文本数据的强大能力。
摘要由CSDN通过智能技术生成
一、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:~#

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值