awk 条件及循环语句和字符串函数
循环 函数 字符串 语句 条件 awk
2023-09-11 14:13:56 时间
条件语句
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.awk
BEGIN{ FS=":" } { if($3<50) { printf "%-20s%-20s%-10d\n","UID<50",$1,$3 } else if ($3>50 && $3<100) { printf "%-20s%-20s%-10d\n","50<UID<100",$1,$3 } else { printf "%-20s%-20s%-10d\n","UID>100",$1,$3 } }
输出 以 UID 以50位为分界点的用户,-f 将条件表达式写到文本中读取
awk -f if.awk passwd
计算下列每个同学的平均分数,并且只打印平均分数大于90的同学姓名和分数信息
Allen 80 90 96 98 Mike 93 98 92 91 Zhang 78 76 87 92 Jerry 86 89 68 92 Han 85 95 75 90 Li 78 88 98 100
算出平局成绩
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
加入条件判断,如果平均分数大于90才打印
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
计算1+2+3+4+...+100的和,请使用while、do while、for三种循环方式实现
通过读取文件的方式载入awk的条件
add_while.awk
BEGIN{ while(i<=100) { # 一个变量不赋值,默认为0或者空 sum+=i i++ } print sum }
do while循环
awk -f add_dowhile.awk
for循环
add_for.awk
BEGIN{ for(i=0;i<=100;i++) { sum+=i } print sum }
字符串函数对照表
案例演示
以 : 为分隔符, 返回/etc/passwd中每行中每个字段的长度
len.wak
BEGIN{ FS=":" } { i=1 while(i<=NF) { if (i==NF) { printf "%d",length($i) } else { printf "%d:",length($i) } i++ } print "" }
awk -f len.awk passwd
搜索字符串"I have a dream"中出现"ea"字符串的位置
awk 'BEGIN{str="I have a gream";printf "%d\n",index(str,"ea")}'
将字符串"Hadoop is a bigdata Framework"全部转换为小写
awk 'BEGIN{str="Hadoop is a bigdata Framework";print tolower(str)}'
将字符串"Hadoop is a bigdata Framework"全部转换为大写
awk 'BEGIN{str="Hadoop is a bigdata Framework";print toupper(str)}'
将字符串"Hadoop Kafka Spark Storm HDFS YARN Zookeeper",按照空格为分隔符,分隔
awk 'BEGIN{str="Hadoop Kafka Spark Storm HDFS YARN Zookeeper";split(str,arr);for (i in arr) print arr[i];}'
搜索字符串"Transaction 2345 Start:Select * from master"第一个数字出现的位置
awk 'BEGIN{str="Transaction 2345 Start:Select * from master";print match(str,/[0-9]/)}'
截取字符串"transaction start"的子串,截取条件从第4个字符开始,截取5位
awk 'BEGIN{str="transaction start";print substr(str,4,5)}'
替换字符串"Transaction 243 Start,Event ID:9002"中第一个匹配到的数字串替换为$符号
awk 'BEGIN{str="Transaction 243 Start,Event ID:9002";count=sub(/[0-9]+/,"$",str);print count;print str}'
gsub是替换全部匹配到的数字 (通过 // 写正则表达式 )
awk 'BEGIN{str="Transaction 243 Start,Event ID:9002";count=gsub(/[0-9]+/,"$",str);print count;print str}'
在awk中数组下标从1开始
awk 'BEGIN{str="Hadoop Kafka Spark Storm HDFS YARN Zookeeper";split(str,arr," ");print arr[0]}'
awk 'BEGIN{str="Hadoop Kafka Spark Storm HDFS YARN Zookeeper";split(str,arr," ");for(i in arr) {print arr[i]}}'
相关文章
- Collection集合+迭代器+foreach循环
- 7.1 itertools--高效循环的创建函数
- [转] JavaScript:彻底理解同步、异步和事件循环(Event Loop)
- 关于大循环编程方法
- parfor并行循环函数简析
- Spring注入Bean的四种方式,循环依赖
- SQLserver用游标实现循环 和 简单的量值函数
- 《Node学习指南》一1.3 异步函数及Node事件循环
- 循环结构select 举例
- 微信-文件组成-模块作用--定义全局方法变量---数据绑定--wx:for循环列表
- 除了信号触发线程与接收者线程相同的情况能直接调用到slot,其它情况都依赖事件机制(解决上面代码收不到信号的问题其实很简单,在线程的run();函数中添加一个事件循环就可以了,即加入一句exec();),信号槽不就是一个回调函数嘛
- JavaScript循环数组
- Spring循环依赖报错Bean with name '**' has been injected into other beans [**] in its raw version as part
- python之range()函数、for-in循环和while循环
- 循环结构程序设计1
- 【C++初阶】C++入门(二):引用&&内联函数&&auto关键字&&范围for循环(C++11)&&指针空值nullptr
- Verilog 循环语句(while, for, repeat, forever)
- Swift - 条件语句和循环语句
- Parallel.For循环与普通的for循环