首页 > 系统相关 >软件测试/测试开发|Linux三剑客之——awk命令详解

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

时间:2023-12-27 17:32:29浏览次数:37  
标签:bin 语句 Awk print awk 软件测试 bash 三剑客

软件测试/测试开发|Linux三剑客之——awk命令详解_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 在处理文本数据时的无限可能性。希望本文能够帮到大家!


标签:bin,语句,Awk,print,awk,软件测试,bash,三剑客
From: https://blog.51cto.com/u_15640304/9002438

相关文章

  • 软件测试/测试开发|一篇文章带你入门HTML
    前言上一篇文章我们提到了web的三大主要资源,HTML,CSS以及JS,HTML是提供web页面内容的资源,本文我们就来介绍一下HTML。HTMLHTML(HyperTextMarkupLanguage)是web的核心组成部分之一,是构建网页的基础语言。HTML使用标记来描述文档的结构,并定义了网页上的内容,包括文本、图像、链接等。HTM......
  • SED,AWK使用详解
    SED,AWK使用1.sed命令sed使用方法​ 一种叫命令模式,一种叫脚本模式命令行模式:格式sed[option]'sed的命令|地址定位' filename说明:引用shellscript中的变量应使用双引号,而非平常使用的单引号option:-e:进行多项编辑,即对输入行应用多条sed命令时使用-n:取消默认的输出......
  • 软件测试基础知识篇
    一、软件测试的目的:发现缺陷错误,并且尽最大可能找出最多的错误,也是对软件质量进行评估,以提高软件质量。二、什么是软件:软件=程序+文档+数据软件是计算机系统中与硬件相互依存的一部分,它是包括程序、文档的完整集合。程序(program)是按事先设计的功能和性能要求执行的指令序列。......
  • 软件测试面试之——你们项目中是如何做用例评审
    ......
  • 软件测试/测试开发|Python selenium CSS定位方法详解
    简介CSS选择器是一种用于选择HTML元素的模式。它允许我们根据元素的标签名、类名、ID、属性等属性进行选择。CSS选择器的语法简单而灵活,是前端开发中常用的定位元素的方式。selenium中的css定位,实际是通过css选择器来定位到具体元素,css选择器来自于css语法。CSS定位有以下显著......
  • 软件测试/测试开发|如何解决pip下载速度慢的问题
    前言我们在使用pip安装Python第三方库时,默认是使用pip的官方镜像源https://pypi.org/下载的,但是有时候,我们下载的库比较大时,就会出现下载比较缓慢的问题,速度有时只有几十KB/s,非常耽误我们的时间,影响我们的工作效率,本文就来介绍一下如何解决这个问题。问题原因因为我们下载默认......
  • 软件测试/测试开发|Ubuntu系统常用文件管理命令详解
    前言Ubuntu是一种广泛使用的Linux操作系统,提供了丰富而强大的文件管理命令,使用户能够通过命令行轻松管理文件和目录。本文将介绍一些常用的Ubuntu文件管理命令,帮助用户更好地理解和利用系统资源。ls-列出目录内容ls[选项][目录]ls命令用于列出目录中的文件和子目录。......
  • 软件测试/测试开发|一文详解Linux grep命令
    简介grep命令是最常用的Linux命令之一,用于对文件和文本执行重复搜索的工具,功能非常强大,也是我们必须学习掌握的Linux三剑客之一,本文就给大家介绍一下grep命令的使用。grep的基本语法grep作为一款文本搜索工具,可以根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打......
  • 软件测试/测试开发|测试用例设计方法——边界值
    前言我们之前介绍了等价类测试用例设计方法,但是等价类测试用例设计方法容易存在问题,即我们取的值不一定在我们程序设计的边界附近,但是在我们的测试实践中,问题往往都是出在输入定义域或输出值域的边界上,而不是在其内部。因此,针对各种边界情况设计测试用例,通常可能会发现更多的bug......
  • 软件测试/测试开发|测试用例设计方法——等价类划分
    前言在软件测试领域,测试用例设计是确保软件系统质量的关键环节之一。等价类划分法(EquivalencePartitioning)是一种被广泛采用的测试用例设计技术,它通过将输入数据划分为相互等价的类别,以确保在每个等价类中选择适当的测试用例,从而提高测试的全面性和效率。1.了解等价类划分法......