写点什么

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

  • 2023-12-27
    北京
  • 本文字数:2573 字

    阅读完需:约 8 分钟

简介

如果你是一位新手 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 999chrony 998xiaowang 1000chenhang 1001zhnagjian 1002zhangjian 1003wangshenghu 1004yalin 1005nginx 997lilanqing 1006califeng 1007cali123 1008shimengmeng 1010zhouyiwei 1011zhaojunjie 1013kimi 1014kimi2 996linhucong 1015kimi3 1016feng2 1018feng3 1019feng4 1020feng5 1021liudehua 1022liming 1023libai 1024xiaoxiao 1025xiyangyang 1026meiyangyang 1027lanyangyang 1028zhangwuji 1029liang 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 englishcali 80 80tom 90 90jarry 70 100
复制代码


  1. 分隔符不是空白时候可以使用-F选项来指定分隔符,如下所示:


$ cat /etc/passwd | tail | awk -F ":" '{print $1,$3,$4}'sanle 9931 9932test 9932 9935wang 9933 9933zhao 9934 9934bobo 9935 9936hang 9936 9937mysql 27 27bailongma 9937 9938baigujing 9938 9939yutujing 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/bashzhnagjian 1002 /bin/bashzhangjian 1003 /bin/bashwangshenghu 1004 /bin/bashyalin 1005 /bin/bashlilanqing 1006 /bin/bashcalifeng 1007 /bin/bashcali123 1008 /bin/bashshimengmeng 1010 /bin/bashzhouyiwei 1011 /bin/bashzhaojunjie 1013 /bin/bashkimi 1014 /bin/bashlinhucong 1015 /bin/bashkimi3 1016 /bin/bashfeng2 1018 /bin/bashfeng3 1019 /bin/bashfeng4 1020 /bin/bashfeng5 1021 /bin/bashliudehua 1022 /bin/bashliming 1023 /bin/bashxiaoxiao 1025 /bin/bashxiyangyang 1026 /bin/bashmeiyangyang 1027 /bin/bashlanyangyang 1028 /bin/bashzhangwuji 1029 /bin/bashliang 1030 /bin/bashuser01 9901 /bin/bashuser02 9902 /bin/bashuser03 9903 /bin/bashuser04 9904 /bin/bashuser05 9905 /bin/bashuser06 9906 /bin/bashuser07 9907 /bin/bashuser08 9908 /bin/bashuser09 9909 /bin/bashzhangheng 9921 /bin/bashzhaomin 9922 /bin/bashwuji 9923 /bin/bashliangluyao 9924 /bin/bashpingguo 9925 /bin/bashjingshi 9926 /bin/bashyueyang 9927 /bin/bashtangpj 9928 /bin/bashtangpz1 9929 /bin/bashsc1 9930 /bin/bashtest 9932 /bin/bashwang 9933 /bin/bashzhao 9934 /bin/bashbobo 9935 /bin/bashhang 9936 /bin/bashbailongma 9937 /bin/bashbaigujing 9938 /bin/bashyutujing 9939 /bin/bashrrrge 9940 /bin/bashuid大于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 在处理文本数据时的无限可能性。希望本文能够帮到大家!


用户头像

社区:ceshiren.com 微信:ceshiren2021 2019-10-23 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料,实时更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬。

评论

发布
暂无评论
软件测试/测试开发|Linux三剑客之——awk命令详解_霍格沃兹测试开发学社_InfoQ写作社区