Shell脚本正则表达式之Awk编程数组与循环

关联数组

  • awk支持关联数组,数组的索引下标可以不是连续的数字,索引下标可以是任意字符,当使用数组作为索引时,awk会自动将数字转换为字符,如果直接用字符做索引则需要使用引号括起来。
  • 语法格式
#一维数组:
数组名[index]=value
#多维数组:
数组名[index1][index2]=value
数组名[index1,index2]=value
  • 操作示例
awk 'BEGIN{a[0]=1;print a[0]}'
awk 'BEGIN{a[0]=1;a[2]=10;print a[0],a[2]}'
awk 'BEGIN{a[0]=1;a[10]=100;print a[0],a[10]}'
awk 'BEGIN{cauchy["name"]="Cauchy";cauchy["age"]=24;cauchy["addr"]="Nanjing"; \
print cauchy["name"],cauchy["age"],cauchy["addr"]}'
awk 'BEGIN{ \
a[0][0]=0;a[0][1]=1; \
print a[0][0],a[0][1]}'
awk 'BEGIN{ \
a["a"]["a"]="aa";a["a"]["b"]="ab"; \
print a["a"]["a"],a["a"]["b"]}'
awk 'BEGIN{ \
a[0,1]=10;a[1,2]=20;a[2,3]=30; \
print a[0,1],a[1,2],a[2,3]}'

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

  • 我们可以使用for循环获取数组元素的索引下标,然后在循环体内将数组元素取出,其语法格式如下。
for(变量 in 数组名){
动作指令序列
}
  • 操作示例
awk 'BEGIN{ \
a[11]="abc";a[22]=23;a["abc"]="hello"; \
for(i in a){print i}}'
awk 'BEGIN{ \
a[11]="abc";a[22]=23;a["abc"]="hello"; \
for(i in a){print a[i]}}'
awk 'BEGIN{ \
a[11]="abc";a[22]=23;a["abc"]="hello"; \
for(i in a){print i"="a[i]}}'

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

  • 结合awk if语句我们还可以对其进行成员判断。
  • 操作示例
awk 'BEGIN{ \
a[11]="hello";a[22]="world"; \
if("hello" in a){print "Y"} else{print "N"}}'
awk 'BEGIN{ \
a[11]="hello";a[22]="world"; \
if(11 in a){print "Y"} else{print "N"}}'

在这里插入图片描述

#查看磁盘可用空间
df |awk 'NR!=1 {disk[$1]=$4} \
END{for(i in disk){printf "%-20s %-10s\n",i,disk[i]}}'

在这里插入图片描述

for循环

  • 语法格式
for(表达式1;表达式2;表达式3){
动作指令序列
}
  • 操作示例
awk 'BEGIN{for(i=1;i<=5;i++){print i}}'
awk 'BEGIN{for(i=5;i>=1;i--){print i}}'

在这里插入图片描述
#统计单词在文中出现的次数

vim word.txt
This is a statistics word text.
I will count how many words in this text.
So Let's do this.
awk '{ \
for(i=1;i<=NF;i++){ \
if($i~/this/) x++}}\
END{print "this在文中出现了"x"次."}' word.txt 

在这里插入图片描述

  • 文章单词定位脚本
#vim location.sh
#!/bin/bash
#功能描述:统计单词在文中的定位

key=$1

awk '{for(i=1;i<=NF;i++){if($i~/'$key'/) print "'$key'的坐标为:"NR"行",i"列."}}' $2

在这里插入图片描述

while循环

  • 语法格式
 while(条件判断){
     动作序列指令;
 } 
  • 操作实例
awk 'BEGIN{i=1;while(i<=5) {print i;i++}}'
awk 'BEGIN{i=5;while(i>=1) {print i;i--}}'

在这里插入图片描述

awk '{i=1;while(i<=NR) {printf "%-2d",$i;i++};print""}' test.txt

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

中断循环

  • 与shell脚本类似awk提供了continue、break和exit循环中断语句,方便我们在特定环境下对循环进行中断操作。continue可以中断本次循环加入下一次循环,break中断整个循环体,exit可以中断整个awk动作指令,直接跳到了END的位置。
  • 操作实例
awk 'BEGIN{ \
i=0;
while(i<=5){
i++;
if(i==4){continue}; 
print i}; \
print "over"} 
END {print "end"}' /etc/hosts

在这里插入图片描述

awk 'BEGIN{ 
i=0;
while(i<=5){
i++;
if(i==4){break}; 
print i}; 
print "over"} 
END {print "end"}' /etc/hosts

在这里插入图片描述

在这里插入图片描述

awk 'BEGIN{ 
i=0;
while(i<=5){
i++;
if(i==4){exit}; 
print i}; 
print "over"} 
END {print "end"}' /etc/hosts

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值