软件测试/测试开发/全日制|Linux三剑客之——awk命令详解

在这里插入图片描述

简介

如果你是一位新手 Linux 用户,可能已经听说过 Awk 这个神奇的命令。Awk 是一种强大的文本处理工具,它可以在命令行中用于处理和分析文本数据。无论是数据提取、格式化、计算还是报告生成,Awk 都是个不可多得的工具。

什么是awk?

Awk 是一种面向文本处理的编程语言,最初由 Alfred Aho、Peter Weinberger 和 Brian Kernighan 在1977年开发。它以它们三人的姓氏首字母命名(Aho、Weinberger 和 Kernighan)。Awk 是一种解释型的语言,也是许多 Unix 系统中默认安装的工具之一。

awk的基本语法

语法格式:

awk 'pattern { action }' filename

语法说明:

  • pattern:用于匹配的条件;
  • action:满足条件后执行的操作;
  • filename:要处理的文件名。

注:awk命令还可以扩展为awk ‘BEGIN {commands} pattern {commands} END {commands}' filename ,即在处理数据前和处理数据后都需要执行命令。

示例如下:

$ cat /etc/passwd|awk -F ":" 'BEGIN{print "###start###"} $3>500&&$3<2000 {print $1,$3}END{print "###end###"}' 
###start###
polkitd 999
chrony 998
xiaowang 1000
chenhang 1001
zhnagjian 1002
zhangjian 1003
wangshenghu 1004
yalin 1005
nginx 997
lilanqing 1006
califeng 1007
cali123 1008
shimengmeng 1010
zhouyiwei 1011
zhaojunjie 1013
kimi 1014
kimi2 996
linhucong 1015
kimi3 1016
feng2 1018
feng3 1019
feng4 1020
feng5 1021
liudehua 1022
liming 1023
libai 1024
xiaoxiao 1025
xiyangyang 1026
meiyangyang 1027
lanyangyang 1028
zhangwuji 1029
liang 1030
###end###

这条命令的要求是,获取etc/passwd的内容,并且打印出数值大于500小于2000的用户名及数值,在打印前输出start,打印结束后输出end

awk的工作流程

由上面命令的执行效果,我们可以知道awk命令的工作流程如下:

  1. 执行BEGIN{commands}语句块中的语句;

  2. 从文件或stdin中读取第一行,看有无模式匹配,若无则执行{}中的语句;

  3. 若有则检查该整行与pattern是否匹配,若匹配,则执行{}中的语句;

  4. 若不匹配则不执行{}中的语句,接着读取下一行;

  5. 重复这个过程,直到所有行被读取完毕;

  6. 执行END{commands}语句块中的语句;

  7. BEGINEND 部分只是执行一次;

  8. 中间部分每一行都执行一次。

指定分隔符

  1. -F 指定分隔符

awk命令的默认分隔符为空格,如下所示:

$ cat grade.txt | awk '{print $2,$3,$4}'
name chinese english
cali 80 80
tom 90 90
jarry 70 100
  1. 分隔符不是空白时候可以使用-F选项来指定分隔符,如下所示:
$ cat /etc/passwd | tail | awk -F ":" '{print $1,$3,$4}'
sanle 9931 9932
test 9932 9935
wang 9933 9933
zhao 9934 9934
bobo 9935 9936
hang 9936 9937
mysql 27 27
bailongma 9937 9938
baigujing 9938 9939
yutujing 9939 9940

awk命令应用

  1. awk进行计算

示例:统计uid>1000并且使用shell是bash的用户的数量

$  awk -F ":" '$3>1000&&$7 ~ /bash/{print $1,$3,$7; i++}END{print "uid大于1000并且shell是bash的人数有:"i"人"}' passwd 
 
chenhang 1001 /bin/bash
zhnagjian 1002 /bin/bash
zhangjian 1003 /bin/bash
wangshenghu 1004 /bin/bash
yalin 1005 /bin/bash
lilanqing 1006 /bin/bash
califeng 1007 /bin/bash
cali123 1008 /bin/bash
shimengmeng 1010 /bin/bash
zhouyiwei 1011 /bin/bash
zhaojunjie 1013 /bin/bash
kimi 1014 /bin/bash
linhucong 1015 /bin/bash
kimi3 1016 /bin/bash
feng2 1018 /bin/bash
feng3 1019 /bin/bash
feng4 1020 /bin/bash
feng5 1021 /bin/bash
liudehua 1022 /bin/bash
liming 1023 /bin/bash
xiaoxiao 1025 /bin/bash
xiyangyang 1026 /bin/bash
meiyangyang 1027 /bin/bash
lanyangyang 1028 /bin/bash
zhangwuji 1029 /bin/bash
liang 1030 /bin/bash
user01 9901 /bin/bash
user02 9902 /bin/bash
user03 9903 /bin/bash
user04 9904 /bin/bash
user05 9905 /bin/bash
user06 9906 /bin/bash
user07 9907 /bin/bash
user08 9908 /bin/bash
user09 9909 /bin/bash
zhangheng 9921 /bin/bash
zhaomin 9922 /bin/bash
wuji 9923 /bin/bash
liangluyao 9924 /bin/bash
pingguo 9925 /bin/bash
jingshi 9926 /bin/bash
yueyang 9927 /bin/bash
tangpj 9928 /bin/bash
tangpz1 9929 /bin/bash
sc1 9930 /bin/bash
test 9932 /bin/bash
wang 9933 /bin/bash
zhao 9934 /bin/bash
bobo 9935 /bin/bash
hang 9936 /bin/bash
bailongma 9937 /bin/bash
baigujing 9938 /bin/bash
yutujing 9939 /bin/bash
rrrge 9940 /bin/bash
uid大于1000并且shell是bash的人数有:54人 
  1. awk的iffor循环

if语句后面执行多个命令的时候,使用{}括起来,最后的命令接``结尾,外面的else ifelse前面就不用再接;了,示例如下:使用awk命令来输出passwd文件里哪些是超级用户,系统用户,普通用户。

$ awk -F ":" '{if($3 ==0 ) print $1"是超级用户";else if($3>1&&$3<=999) print $1"是系统用户"; else print $1"是普通用户"}' passwd 
root是超级用户
bin是普通用户
daemon是系统用户
adm是系统用户
lp是系统用户
sync是系统用户
shutdown是系统用户

使用awk命令来输出passwd文件里哪些是超级用户,系统用户,普通用户。并输出各用户的个数。

$ awk -F : '{if($3 == 0){print $1"是超级用户";num1++;}else if($3>1 && $3 <1000){print $1"是系统用户";num2++;}else{print $1 "是普通用户";num3++;}}END{print"超级用户有:"num1"系统用户有:"num2"普通用户有:"num3}' passwd 
root是超级用户
bin是普通用户
daemon是系统用户
adm是系统用户
lp是系统用户
sync是系统用户
shutdown是系统用户
halt是系统用户
mail是系统用户
operator是系统用户
games是系统用户
tcpdump是系统用户
sanle是普通用户
test是普通用户
wang是普通用户
zhao是普通用户
bobo是普通用户
hang是普通用户
mysql是系统用户
bailongma是普通用户
baigujing是普通用户
yutujing是普通用户
rrrge是普通用户
mengmeng1是普通用户
mengmeng2是普通用户
mengmeng3是普通用户
超级用户有:1系统用户有:23普通用户有:63

总结

Awk 是一个功能强大且灵活的工具,在处理文本数据时非常有用。虽然这里只介绍了一些基本用法和常见应用,但 Awk 的功能远不止于此。通过不断练习和探索,你将发现 Awk 在处理文本数据时的无限可能性。希望本文能够帮到大家!

获取更多技术资料,请点击!

推荐

Python全栈开发与自动化测试开发班
由浅入深实战进阶,从小白到高手

以Python全栈开发为基础,深入教授自动化测试技能,为学员打造全面的技术能力。通过系统学习和实际项目实战,学员将具备在职场中脱颖而出的竞争力。不仅能够灵活运用Python进行开发,还能够保障项目质量通过自动化测试手段。这是一个全面提升职业竞争力的机会。

课程详情
Python开发必备基础技能与项目实战
Pvthon 编程语言/算法和数据结构/面向对象编程Web后端开发/前端开发/测试管理平台项目实战

人工智能ChatGPT实战
人工智能辅助学习各种开发和测试技能/Pytorch深度学框架/平台开发实战

数据分析与自动化办公
数据采集/Pandas与数据处理技术/ECharts与数据可视化技术/爬虫实战/自动化办公/批量文件处理

UI自动化测试与高级项目实战
Web自动化测试/App自动化测试/ PageObject设计模式

接口自动化测试
接口协议分析/Mock实战/服务端接口测试

性能测试
性能测试流程与方法/JMeter 脚本参数化/Grafana监控系统搭建

简历指导与模拟面试
1V1简历指导/模拟真实面试/测试开发岗面试全攻略名企私教服务
名企专家1v1辅导/行业专家技术指导/针对性解决工作难题/绩效提升辅导与晋升复盘

课程亮点
名企私教服务 先学习后付费 高额奖学金
专属社群+晚自习在线答疑
5V1全方位辅导作业+考试强化学习效果
简历修改 模拟面试 就业内推 面试复盘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值