shell编程系列18--文本处理三剑客之awk动作中的条件及if/while/do while/for循环语句
shell编程系列18--文本处理三剑客之awk动作中的条件及if/while/do while/for循环语句
条件语句 if(条件表达式)
动作1
else if(条件表达式)
动作2
else
动作3 循环语句:
while循环:
while(条件表达式)
动作 do while循环:
do
动作
while(条件表达式) for循环:
for(初始化计数器;计数器测试;计数器变更)
动作 、以:为分隔符,只打印/etc/passwd中第3个字段的数值在50-100范围内的行信息
# 简单运算符处理
awk 'BEGIN{FS=":"}{if($3>50 && $3<100) print $0}' passwd # if 条件处理
# 输出 以 UID 以50位为分界点的用户,-f 将条件表达式写到文本中读取
[root@localhost shell]# awk -f if.awk passwd
UID< root
UID< bin
UID< daemon
UID< adm
UID< lp
UID< sync
UID< shutdown
UID< halt
UID< mail
UID< operator
UID< games
UID< ftp
<UID< nobody
UID> systemd-network
<UID< dbus
UID> polkitd
<UID< sshd
<UID< postfix
UID> ajie
UID> chrony
UID> deploy
UID> nginx
[root@localhost shell]# cat if.awk
BEGIN{
FS=":"
}
{
if($<)
{
printf "%-20s%-20s%-10d\n","UID<50",$,$
}
else if ($> && $<)
{
printf "%-20s%-20s%-10d\n","50<UID<100",$,$
}
else
{
printf "%-20s%-20s%-10d\n","UID>100",$,$
}
} 、计算下列每个同学的平均分数,并且只打印平均分数大于90的同学姓名和分数信息
Allen
Mike
Zhang
Jerry
Han
Li # 算出平均成绩
[root@localhost shell]# awk 'BEGIN{printf "%-20s%-20s%-20s%-20s%-20s%-20s\n","Name","Chinese","English","Math","Physical","Average"}{sum=$2+$3+$4+$5;avg=sum/4}{printf "%-20s%-20d%-20d%-20d%-20d%-0.2f\n",$1,$2,$3,$4,$5,avg}' student.txt
Name Chinese English Math Physical Average
Allen 91.00
Mike 93.50
Zhang 83.25
Jerry 83.75
Han 86.25
Li 91.00
# 加入条件判断,如果平均分数大于90才打印
[root@localhost shell]# awk 'BEGIN{printf "%-20s%-20s%-20s%-20s%-20s%-20s\n","Name","Chinese","English","Math","Physical","Average"}{sum=$2+$3+$4+$5;avg=sum/4}{if(avg>90) printf "%-20s%-20d%-20d%-20d%-20d%-0.2f\n",$1,$2,$3,$4,$5,avg}' student.txt
Name Chinese English Math Physical Average
Allen 91.00
Mike 93.50
Li 91.00 、计算1++++...+100的和,请使用while、do while、for三种循环方式实现
通过读取文件的方式载入awk的条件 # while循环
[root@localhost shell]# cat add_while.awk
BEGIN{
while(i<=)
{
# 一个变量不赋值,默认为0或者空
sum+=i
i++
}
print sum
} # do while循环
[root@localhost shell]# awk -f add_dowhile.awk [root@localhost shell]# cat add_dowhile.awk
BEGIN{
do {
sum+=i
i++
}while(i<=)
print sum
} # for循环
[root@localhost shell]# awk -f add_for.awk [root@localhost shell]# cat add_for.awk
BEGIN{
for(i=;i<=;i++)
{
sum+=i
}
print sum
} # uid在50和100之间
[root@localhost shell]# awk 'BEGIN{FS=":"}{if($3>50 && $3<100) print $0}' passwd
# uid小于50或者大于100
[root@localhost shell]# awk 'BEGIN{FS=":"}{if($3<50 || $3>100) print $0}' passwd [root@localhost shell]# awk 'BEGIN{FS=":"}{if($3<50){printf "%-30s%-30s%-15d\n","小于50的UID",$1,$3} else if($3>50 && $3<100) {printf "%-30s%-30s%-15d\n","大于50并且小于100的UID",$1,$3} else {printf "%-30s%-30s%-15d\n","大于100的UID",$1,$3}}' passwd
小于50的UID root
小于50的UID bin
小于50的UID daemon
小于50的UID adm
小于50的UID lp
小于50的UID sync
小于50的UID shutdown
小于50的UID halt
小于50的UID mail
小于50的UID operator
小于50的UID games
小于50的UID ftp
大于50并且小于100的UID nobody
大于100的UID systemd-network
大于50并且小于100的UID dbus
大于100的UID polkitd
大于50并且小于100的UID sshd
大于50并且小于100的UID postfix
大于100的UID ajie
大于100的UID chrony
大于100的UID deploy
大于100的UID nginx # awk 通过-f参数读取文件的方式读取条件进行输出
[root@localhost shell]# cat scripts.awk
BEGIN{
FS=":"
} {
if($<)
{
printf "%-20s%-30s%-5d\n","UID<50",$,$
}
else if ($> && $<)
{
printf "%-20s%-30s%-5d\n","50<UID<100",$,$
}
else
{
printf "%-20s%-30s%-5d\n","UID>100",$,$
}
}
[root@localhost shell]# awk -f scripts.awk passwd
UID< root
UID< bin
UID< daemon
UID< adm
UID< lp
UID< sync
UID< shutdown
UID< halt
UID< mail
UID< operator
UID< games
UID< ftp
<UID< nobody
UID> systemd-network
<UID< dbus
UID> polkitd
<UID< sshd
<UID< postfix
UID> ajie
UID> chrony
UID> deploy
UID> nginx
[root@localhost shell]# 循环语句-do while do while
do
动作
while(条件表达式) 循环语句-for for
for(初始化计数器;测试计数器;计数器变更)
动作 # while循环
[root@localhost shell]# cat while.awk
BEGIN{
while(i<=)
{
sum+=i
i++
}
print sum
}
[root@localhost shell]# awk -f while.awk # for循环
[root@localhost shell]# cat for.awk
BEGIN{
for(i=;i<=;i++)
{
sum+=i
}
print sum
}
[root@localhost shell]# awk -f for.awk # do while循环
[root@localhost shell]# cat dowhile.awk
BEGIN{
do
{
sum+=i
i++
}while(i<=)
print sum
}
[root@localhost shell]# awk -f dowhile.awk [root@localhost shell]# cat student.txt
Name chinese english math physical average
Allen
Mike
Zhang
Jerry
Han
Li # 打印平均分大于90的人,并计算出各科总分
[root@localhost shell]# cat student.txt
Allen
Mike
Zhang
Jerry
Han
Li
[root@localhost shell]# cat student.awk
BEGIN{
printf "%-10s%-10s%-10s%-10s%-10s%-10s\n","Name","Chinese","English","Math","Physical","Average"
} {
total=$+$+$+$
avg=total/
if(avg>)
{
printf "%-10s%-10d%-10d%-10d%-10d%-0.2f\n",$,$,$,$,$,avg
# 将每一科的成绩累加起来保存在一个变量中
score_chinese+=$
score_english+=$
score_math+=$
score_physical=$
}
}
END{
printf "%-10s%-10d%-10d%-10d%-10d\n","Name",score_chinese,score_english,score_math,score_physical
}
[root@localhost shell]# awk -f student.awk student.txt
Name Chinese English Math Physical Average
Allen 91.00
Mike 93.50
Li 91.00
Name
shell编程系列18--文本处理三剑客之awk动作中的条件及if/while/do while/for循环语句的更多相关文章
- shell编程系列17--文本处理三剑客之awk动作中的表达式用法
shell编程系列17--文本处理三剑客之awk动作中的表达式用法 awk动作表达式中的算数运算符 awk动作中的表达式用法总结: 运算符 含义 + 加 - 减 * 乘 / 除 % 模 ^或** 乘方 ...
- shell编程系列14--文本处理三剑客之awk的概述及常用方法总结
shell编程系列14--文本处理三剑客之awk的概述及常用方法总结 awk是一个文本处理工具,通常用于处理数据并生成结果报告 awk的命名是它的创始人 Alfred Aho.Peter Weinbe ...
- shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计
shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计 shell中的数组的用法: shell数组中的下标是从0开始的 array=("Allen" & ...
- shell编程系列20--文本处理三剑客之awk常用选项
shell编程系列20--文本处理三剑客之awk常用选项 awk选项总结 选项 解释 -v 参数传递 -f 指定脚本文件 -F 指定分隔符 -V 查看awk的版本号 [root@localhost s ...
- shell编程系列19--文本处理三剑客之awk中的字符串函数
shell编程系列19--文本处理三剑客之awk中的字符串函数 字符串函数对照表(上) 函数名 解释 函数返回值 length(str) 计算字符串长度 整数长度值 index(str1,str2) ...
- shell编程系列16--文本处理三剑客之awk模式匹配的两种方法
shell编程系列16--文本处理三剑客之awk模式匹配的两种方法 awk的工作模式 第一种模式匹配:RegExp 第二种模式匹配:关系运算匹配 用法格式对照表 语法格式 含义 RegExp 按正则表 ...
- shell编程系列15--文本处理三剑客之awk格式化输出printf
shell编程系列15--文本处理三剑客之awk格式化输出printf printf的格式说明符 格式符 含义 %s 打印字符串 %d 打印十进制数 %f 打印一个浮点数 %x 打印十六进制数 %o ...
- shell编程系列11--文本处理三剑客之sed利用sed删除文本中的内容
shell编程系列11--文本处理三剑客之sed利用sed删除文本中的内容 删除命令对照表 命令 含义 1d 删除第一行内容 ,10d 删除1行到10行的内容 ,+5d 删除10行到16行的内容 /p ...
- shell编程系列13--文本处理三剑客之sed利用sed追加文件内容
shell编程系列13--文本处理三剑客之sed利用sed追加文件内容 追加用法总结: .a 在匹配行后面追加 .i 在匹配行前面追加 .r 将文件内容追加到匹配行后面 .w 将匹配行写入指定文件 追 ...
随机推荐
- wireshark 抓包再利用TCP socket发送包里的payload是可以实现登陆的
用户密码可被批量破解 在用户使用手机端登录时,对数据进行抓包分析. 多次抓包分析后,可得到几个关键TCP数据包. 根据前面逆向编写出的解密算法,使用socket进行数据发包测试: 可以模拟APK进行用 ...
- 只有tcp6
为什么 netstat 对某些服务只显示了 tcp6 监听端口 tags: linux 最近偶尔发现一个比较奇怪的现象,netstat 查看监听的服务端口时,却只显示了 tcp6 的监控, 但是服务明 ...
- 神经网络(4)---神经网络是如何帮助我们学习复杂的nonlinear hypotheses
神经网络是如何一步步进行计算的,以及对计算过程的向量化 Z1(2),Z2(2),Z3(2) are just weighted linear combination of input value x1 ...
- oracle数据库锁表
在团队开发一个项目的时候,避免不了两个或两个以上的人同时操作某一数据库中的同一张表,这时候,如果一个用户没有提交事务,或者忘记提交事务,那么其他用户就不能对这张表进行操作了,这是很烦人的事情,下面是查 ...
- java 反射获取字段为List类型中的泛型类型
在java编程时,经常会使用反射去处理对象,有时会需要知道List的泛型类型:示例操作如下 obj = pojo.newInstance(); // 首先得到pojo所定义的字段 Field[] fi ...
- 2019.11.15 JQ图片轮播
<div class="three"> <div class="bjtp"> <img class="bjpic b1& ...
- 目录——创建、切换、pwd、删除、复制、剪切
1.创建目录: (1)在已经存在的目录下新建一个目录: 可以看出在创建1997目录后,在tmp中能够顺利找到. (2)在一个不存在的目录下新建一个目录: 直接在tmp目录下新建一个a目录,再在a目录下 ...
- RookeyFrame 迁移 线下Model 新增属性 迁移 到数据库
在类库 Rookey.BusSys.Operate(类库) -> InitOperate.cs(类) -> App_Start(方法) 添加代码(举例): ToolOperate.Rep ...
- flutter踩坑小记:The number of method references in a .dex file cannot exceed 64K.
The number of method references in a .dex file cannot exceed 64K. 这句话的意思翻译出来是:.dex文件中的方法引用数不能超过64K. ...
- copy()函数技术推演
/*** str_copy.c ***/ #include<stdio.h> void copy_str21(char *from, char *to) { for(; *from != ...