Linux Shell 脚本编程基础知识篇—awk的条件判断(3)

ℹ️大家好,我是练小杰,今天周五了,又是一周过去了😆
本文是有关Linux shell脚本编程的awk命令的条件语句,后续我会不断增加相关内容 ~~
回顾:【awk字符串函数和内置变量
更多Linux 相关内容请点击👉【Linux专栏

在这里插入图片描述

在这里插入图片描述

前言

在Shell脚本中的条件判断语句,与C语言、PHP语法里的条件判断语句如出一辙,学过C语言条件判断语句的朋友应该深有体会!!!

awk条件判断

与C语言一样,awk脚本中也有if选择语句,for循环,while循环等的条件判断语句,下面就来讲讲awk脚本的判断,循环语句以及awk命令的综合练习~~

单分支语句

if判断后面如果只有一个动作指令,则花括号{}可省略,如果if判断后面的指令为多条指令则需要使用花括号括起来,多个指令使用分号分隔。

  • 基本语法:
if(判断条件){
动作指令序列;
} 
  • 举例:查找cpu使用率大于0.5的进程
[root@localhost ~]#  ps -eo user,pid,pcpu,comm | awk '{if($3>0.5) print}'
root  8078  0.9 gnome-shell

双分支if语句

  • 基本语法:
if (判断条件){
动作指令序列1;
}  
else {动作指令序列2;
}

举例

  • 当文件中第二列大于100时输出当前脚本名,否则输出“第二列不大于100”
awk '{ if ($2 > 100) print $0; else print "第二列不大于100" }' 文件名
  • 统计文件/etc/passwd 中系统用户和普通用户的个数
awk –F ':' '{if($3<1000) {x++} else{y++}} END{print "系统用户:" x "","普通用户的个数:" y ""}' /etc/passwd

#输出: 系统用户:44 普通用户的个数:15

多分支语句

if (判断条件1) {
    动作指令1;
} else if (判断条件2) {
    动作指令2;
} else {
    动作指令N;
}

说明:

  1. 首先检查判断条件1,如果条件为,则执行动作指令1
  2. 如果判断条件1,则继续检查判断条件2,如果条件为,则执行动作指令2
  3. 如果判断条件1和判断条件2都为假,则执行动作指令N

实例:

  • 计算当前目录下,普通文件的大小,使用KB作为单位
ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:“ int(sum/1024),"KB"}'    

命令解释:

  • ls -l:该命令列出当前目录下的所有文件和目录的详细信息,包括权限、链接数、所有者、所属组、大小、修改日期和文件名。
  • 'BEGIN{sum=0}':在处理任何输入行之前,先初始化一个变量 sum 为 0。
  • !/^d/{sum+=$5} :对于每一行输入,如果该行不以字母 d 开头(!/^d/),则将该行的第5个字段(文件大小)加到 sum 中。这里 ^d 表示以 d 开头的行,通常目录行的第一个字符是 d,所以这个条件排除了目录,只计算文件的大小。
  • END{print "total size is:" int(sum/1024),"KB"}:在处理完所有输入行后,打印总大小。int(sum/1024) 将总大小转换为KB,并取整。
  • 统计netstat -anp 状态为LISTEN和CONNECT的连接数量分别是多少
netstat -anp | awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s \n", i," ",sum[i]}'

命令解释:

  • netstat : 查看网络连接、路由表和网络接口信息
  • $6~/LISTEN|CONNECTED/:检查每一行的第6个字段是否匹配 LISTEN 或 CONNECTED。~ 是匹配操作符,用于模式匹配。
  • {sum[$6]++}:如果匹配成功,则将该状态的计数器加1。这里使用关联数组 sum 来记录每种状态的数量。
  • END{...}: 在处理完所有输入行后执行的代码块。
  • for (i in sum):遍历关联数组 sum 中的所有元素。
  • printf "%-10s %-6s %-3s \n", i," ",sum[i]:格式化输出。每行输出三个字段:状态名称(左对齐,占10个字符宽度)、一个空格(占6个字符宽度)、状态数量(左对齐,占3个字符宽度)。

While循环

  • while循环用于不断执行一系列命令,直到测试条件为假(false)
  • break语句用来终止一个重复执行的循环。这种循环可以是for、until或者while语句构成的循环。
	break [n]
  • continue语句跳过循环体中位于它后面的语句,回到本层循环的开头,进行下一次循环。
continue [n]
  • exit语句用来退出一个Shell程序,并设置退出值。
exit [n]
  • 基本语法:
while (condition) {while body}	

#或者嵌套用法
while 测试条件
	do
      语句序列
	done
  • 举例:awk 命令用于逐行读取 lxj.txt 文件,并对每一行中的每个字段进行遍历和打印
awk '{
  i=1
  while(i <= NF) {
    print $i
    i++
  }
}' lxj.txt
  • 命令解释
  • while(i <= NF): while 循环用于遍历当前行的所有字段。
    NF 是 awk 的一个内置变量,表示当前行的字段数量(Number of Fields)。
    i <= NF 是循环条件,表示当 i 小于或等于当前行的字段数时继续循环。

  • print $i
    print 是 awk 的一个内置函数,用于输出内容。
    $i 是 awk 的一个特殊变量,表示当前行的第 i 个字段。例如,$1 表示第一个字段,$2 表示第二个字段,依此类推。

do-while循环

  • 基本格式:
do {body} while (condition)
  • 实例:awk 命令用于逐行读取 lxj.txt 文件,并对每一行中的每个字段进行遍历和打印(和上面例子效果一样)
awk '{
  i = 1
  do {
    print $i
    i++
  } while (i <= NF)
}'  lxj.txt

for循环

  • 基本语法:
for (variable assignment; condition; iteration process)
{ body}
  • 举例:awk 命令用于逐行读取 test.txt 文件,并对每一行中的每个字段、进行遍历和打印
awk '{
  for(i=1; i<=NF; i++) {
    print $i
  }
}' test.txt

解释:

for(i=1; i<=NF; i++): for 循环用于遍历当前行的所有字段
i=1:初始化循环变量 i 为 1,表示从第一个字段开始。
i<=NF:循环条件,NF 是 awk 的一个内置变量,表示当前行的字段数量。因此,i<=NF 表示当 i 小于或等于当前行的字段数时继续循环。
i++:每次循环后,i 的值增加 1

awk命令综合练习

  • 创建文本文件ljjawk.txt内容如下:
Mike Harrington:[510] 548-1278:250:100:175
Christian Dobbins:[408] 538-2358:155:90:201
Susan Dalsass:[206] 654-6279:250:60:50
Archie McNichol:[206] 548-1348:250:100:175
Jody Savage:[206] 548-1278:15:188:150
Guy Quigley:[916] 343-6410:250:100:175
Dan Savage:[406] 298-7744:450:300:275
Nancy McNeil:[206] 548-1278:250:80:75
John Goldenrod:[916] 348-4278:250:100:175
Chet Main:[510] 548-5258:50:95:135
Tom Savage:[408] 926-3456:250:168:200
Elizabeth Stachelin:[916] 440-1763:175:75:300
  • 利用ljjawk.txt文本文件内容进行以下练习:
  1. 显示所有电话号码
  2. 显示Dan的电话号码
  3. 显示Susan的名字和电话号码
  4. 显示所有以D开头的姓
  5. 显示所有以一个C或E开头的名
  6. 显示所有只有四个字符的名
  7. 显示所有区号为916的人名
  8. 显示Mike的捐款.显示每个值时都有以$开头。如$250$100$175
  9. 显示姓,其后跟一个逗号和名,如Jody,Savage
  10. 写一个awk的脚本,它的作用:显示Savage的全名和电话号码.显示Chet的捐款.显示所有头一个月捐款$250的人名.

答案如下:

  • 执行查询命令之前,先看看所有电话号码
cat  ljjawk.txt

在这里插入图片描述

  • 显示Dan的电话号码
awk ':' '$1~/Dan/ {print $2}' ljjawk.txt 

在这里插入图片描述

  • 显示Susan的名字和电话号码
awk -F ':' '$1~/Susan/ {print $1 $2}' ljjawk.txt

在这里插入图片描述

  • 显示所有以D开头的姓
awk -F ':' '$1~/^D/ {print $1}' ljjawk.txt

在这里插入图片描述

  • 显示所有以一个C或E开头的名
awk -F: '$1~/^[C|E]/ {print $1}' ljjawk.txt | awk '{print $2}'

在这里插入图片描述

  • 显示所有只有四个字符的名
awk 'length($1)=="4" {print $1}' ljjawk.txt

在这里插入图片描述

  • 显示所有区号为916的人名
awk -F "[:]" '$2~/916/ {print $1}' ljjawk.txt

在这里插入图片描述

  • 显示Mike的捐款.显示每个值时都有以$开头
awk -F "[:]" '$1~/Mike/ {print "$"$3 "$"$4 "$"$5}' ljjawk.txt

在这里插入图片描述

  • 显示姓,其后跟一个逗号和名
awk  '{print $1","$2}' ljjawk.txt

在这里插入图片描述在这里插入图片描述

  • 编写一个awk的脚本,它的作用:显示Savage的全名和电话号码.显示Chet的捐款.显示所有头一个月捐款$250的人名
awk 'BEGIN{FS=":" } { 
if ($1~/Savage/) { print $1,$2} 
if($1~/Chet/) {print $3,$4,$5}
if($3~/250/) {print $1}
}' ljjawk.txt

在这里插入图片描述

至此,awk命令的相关内容到这里就结束了😆
如果想了解更多,点击主页【练小杰的优快云
⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!!
下周再见啦,各位🧍‍♂️大佬们~~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

练小杰

感谢支持!祝各位月入过万!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值