shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计
shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计 shell中的数组的用法:
shell数组中的下标是从0开始的 array=("Allen" "Mike" "Messi" "Jerry" "Hanmeimei" "Wang")
打印元素: echo ${array[]}
打印元素个数: echo ${#array[@]}
打印某个元素长度: echo ${#array[]} 给元素赋值: array[]=ui;
删除元素: unset array[];unset array # 删除数组
分片访问: echo ${array[@]::}
元素内容替换: ${array[@]/e/E} 只替换第一个e;${array[@]//e/E} 替换所有的e 数组的遍历:
for a in ${array[@]}
do
echo $a
done awk中数组的用法:
在awk中,使用数组时,不仅可以使用1...n作为数组小标,也可以使用字符串作为数组下标 典型常用例子:
、统计主机上所有的tcp链接状态数,按照每个tcp状态分类
# netstat -an | grep tcp | awk '{arr[$6]++}END{for (i in arr) print i,arr[i]}'
LAST_ACK
LISTEN
SYN_RECV
ESTABLISHED
FIN_WAIT1
FIN_WAIT2
CLOSING
TIME_WAIT 、计算横向数据综合,计算纵向数据总和 Allen
Mike
Zhang
Jerry
Han
Li # 代码如下:
[root@localhost shell]# awk -f statics.awk student.txt
Name Yuwen Math English Physical total
Allen
Mike
Zhang
Jerry
Han
Li
every_total
[root@localhost shell]# cat statics.awk
BEGIN{
printf "%-30s%-30s%-30s%-30s%-30s%-30s\n","Name","Yuwen","Math","English","Physical","total"
}
{
total=$+$+$+$
yuwen_sum+=$
math_sum+=$
english_sum+=$
physical_sum+=$
printf "%-30s%-30d%-30d%-30d%-30d%-30d\n",$,$,$,$,$,total
}
END{
printf "%-30s%-30d%-30d%-30d%-30d\n","every_total",yuwen_sum,math_sum,english_sum,physical_sum
} 计算字符串的长度:
[root@localhost shell]# str="test string"
[root@localhost shell]# echo $str
test string
[root@localhost shell]# echo ${#str} # 修改数组元素
array=("Allen" "Mike" "Messi" "Jerry" "Hanmeimei" "Wang")
[root@localhost shell]# array[]="Jerry"
[root@localhost shell]# echo ${array[@]}
Allen Jerry Messi Jerry Hanmeimei Wang # 删除第3个元素
[root@localhost shell]# echo ${array[@]}
Allen Jerry Messi Jerry Hanmeimei Wang
[root@localhost shell]#
[root@localhost shell]# unset array[];
[root@localhost shell]# echo ${array[@]}
Allen Jerry Jerry Hanmeimei Wang # 在数组中删除下标为1的元素,即Mike被删除,再次删除下标为1的元素,发现数组不变,说明数组虽然删除了元素,下标还是不变保存在内存中
[root@localhost shell]# array=("Allen" "Mike" "Messi" "Jerry" "Hanmeimei" "Wang")
[root@localhost shell]# unset array[]
[root@localhost shell]# echo ${array[*]}
Allen Messi Jerry Hanmeimei Wang
[root@localhost shell]# unset array[]
[root@localhost shell]# echo ${array[*]}
Allen Messi Jerry Hanmeimei Wang # 分片访问,数组为1的开始遍历3个元素
[root@localhost shell]# array=("Allen" "Mike" "Messi" "Jerry" "Hanmeimei" "Wang")
[root@localhost shell]# echo ${array[@]::}
Mike Messi Jerry
# 1到最后
[root@localhost shell]# echo ${array[@]:}
Mike Messi Jerry Hanmeimei Wang #替换1个,替换所有
[root@localhost shell]# echo ${array[@]}
Allen Mike Messi Jerry Hanmeimei Wang
[root@localhost shell]# echo ${array[@]/e/E}
AllEn MikE MEssi JErry HanmEimei Wang
[root@localhost shell]# echo ${array[@]//e/E}
AllEn MikE MEssi JErry HanmEimEi Wang # 遍历数组
[root@localhost shell]# for a in ${array[@]};do echo $a;done
Allen
Mike
Messi
Jerry
Hanmeimei
Wang 计算横向和、纵向和 Allen
Mike
Zhang
Jerry
Han
Li [root@localhost shell]# awk -f stu.awk student.txt
Name Yuwen Math English Physical total
Allen
Mike
Zhang
Jerry
Han
Li
every_total
[root@localhost shell]# cat stu.awk
BEGIN{
printf "%-20s%-20s%-20s%-20s%-20s%-20s\n","Name","Yuwen","Math","English","Physical","total"
} { total=$+$+$+$
yunwen_sum+=$
math_sum+=$
english_sum+=$
physical_sum+=$
printf "%-20s%-20d%-20d%-20d%-20d%-20d\n",$,$,$,$,$,total
}
END{
printf "%-20s%-20d%-20d%-20d%-20d\n","every_total",yunwen_sum,math_sum,english_sum,physical_sum
} # 模拟生产环境数据脚本
[root@localhost shell]# cat insert.sh
#!/bin/bash
# function create_random()
{
min=$
max=$(($-$min+))
num=$(date +%s%N)
echo $(($num%$max+$min))
} INDEX= while true
do
for user in Allen Mike Jerry Tracy Hanmeimei Lilei
do
COUNT=$RANDOM
NUM1=`create_random $COUNT`
NUM2=`expr $COUNT - $NUM1`
echo "`date '+%Y-%m-%d %H:%M:%S'` $INDEX Batches: user:$user insert $COUNT records into datebase:product table:detail, insert $NUM1 records successfully,
failed $NUM2 records" >> ./db.log.`date +%Y%m%d`
INDEX=`expr $INDEX + `
done
done 数据格式如下:
db.log. -- :: Batches: user Jerry insert records into datebase:product table:detail, insert records successfully,failed records
-- :: Batches: user Tracy insert records into datebase:product table:detail, insert records successfully,failed records
-- :: Batches: user Hanmeimei insert records into datebase:product table:detail, insert records successfully,failed records
-- :: Batches: user Lilei insert records into datebase:product table:detail, insert records successfully,failed records
-- :: Batches: user Allen insert records into datebase:product table:detail, insert records successfully,failed records
... 、统计每个人分别插入了多少条record进数据库
输出结果示例:
Name totalrecords
allen
mike [root@localhost shell]# awk -f exam1.awk db.log.
User Total records
Jerry
Mike
Lilei
Hanmeimei
Tracy
Allen
[root@localhost shell]# cat exam1.awk
BEGIN{
printf "%-20s%-20s\n","User","Total records"
} {
USER[$]+=$
} END{
for(u in USER)
printf "%-20s%-20d\n",u,USER[u]
} 、统计每个人分别插入成功了多少record,失败了多少record 输出结果:
User Success_record failed_record
jerry success $
failed $ [root@localhost shell]# cat exam2.awk
BEGIN{
printf "%-30s%-30s%-30s\n","User","Success records","Failed records"
} {
SUCCESS[$]+=$
FAILED[$]+=$
} END{
for(u in SUCCESS)
printf "%-30s%-30d%-30d\n",u,SUCCESS[u],FAILED[u]
}
[root@localhost shell]# awk -f exam2.awk db.log.
User Success records Failed records
Jerry
Mike
Lilei
Hanmeimei
Tracy
Allen 、将例子1和例子2结合起来,一起输出,输出每个人分别插入多少条数据,多少成功,多少失败,并且要格式化输出,加上标题
输出结果:
User Total success failed
tracy
allen 代码:
[root@localhost shell]# cat exam3.awk
BEGIN{
printf "%-30s%-30s%-30s%-30s\n","Name","total records","success records","failed records"
} {
TOTAL_RECORDS[$]+=$
SUCCESS[$]+=$
FAILED[$]+=$
} END{
for(u in TOTAL_RECORDS)
printf "%-30s%-30d%-30d%-30d\n",u,TOTAL_RECORDS[u],SUCCESS[u],FAILED[u]
}
[root@localhost shell]# awk -f exam3.awk db.log.
Name total records success records failed records
Jerry
Mike
Lilei
Hanmeimei
Tracy
Allen 、在例子3的基础上,加上结尾,统计全部插入记录数,成功记录数,失败记录数
输出结果:
User Total success failed
tracy
allen 方法1:
[root@localhost shell]# cat exam4_b.awk
BEGIN{
printf "%-30s%-30s%-30s%-30s\n","Name","total records","success records","failed records"
} {
TOTAL_RECORDS[$]+=$
SUCCESS[$]+=$
FAILED[$]+=$
} END{
for(u in TOTAL_RECORDS)
{
# 在统计出的结果数组中进行累加
records_sum+=TOTAL_RECORDS[u]
success_sum+=SUCCESS[u]
failed_sum+=FAILED[u]
printf "%-30s%-30d%-30d%-30d\n",u,TOTAL_RECORDS[u],SUCCESS[u],FAILED[u]
} printf "%-30s%-30d%-30d%-30d\n","",records_sum,success_sum,failed_sum
}
[root@localhost shell]# awk -f exam4_b.awk db.log.
Name total records success records failed records
Jerry
Mike
Lilei
Hanmeimei
Tracy
Allen 方法2:
[root@localhost shell]# cat exam4.awk
BEGIN{
printf "%-30s%-30s%-30s%-30s\n","Name","total records","success records","failed records"
} {
RECORDS[$]+=$
SUCCESS[$]+=$
FAILED[$]+=$ # 在原始数据中进行汇总计算
records_sum+=$
success_sum+=$
failed_sum+=$
} END{
for(u in RECORDS)
printf "%-30s%-30d%-30d%-30d\n",u,RECORDS[u],SUCCESS[u],FAILED[u] printf "%-30s%-30d%-30d%-30d\n","total",records_sum,success_sum,failed_sum
}
[root@localhost shell]# awk -f exam4.awk db.log.
Name total records success records failed records
Jerry
Mike
Lilei
Hanmeimei
Tracy
Allen
total 、查找丢失数据的现象,也就是成功+失败的记录数不等于一共插入的记录数,找出这些数据并显示行号和对应行的日志信息
输出结果: 代码:
[root@localhost shell]# awk '{if($8!=$14+$17) print NR,$0}' db.log.
-- :: Batches: user Hanmeimei insert records into datebase:product table:detail, insert records successfully,failed records
-- :: Batches: user Mike insert records into datebase:product table:detail, insert records successfully,failed records # 写入文件的方式
[root@localhost shell]# awk -f exam5.awk db.log.
-- :: Batches: user Hanmeimei insert records into datebase:product table:detail, insert records successfully,failed records
-- :: Batches: user Mike insert records into datebase:product table:detail, insert records successfully,failed records
[root@localhost shell]# cat exam5.awk
BEGIN{
}
{
if($!=$+$)
print NR,$
}
shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计的更多相关文章
- shell编程系列19--文本处理三剑客之awk中的字符串函数
shell编程系列19--文本处理三剑客之awk中的字符串函数 字符串函数对照表(上) 函数名 解释 函数返回值 length(str) 计算字符串长度 整数长度值 index(str1,str2) ...
- shell编程系列18--文本处理三剑客之awk动作中的条件及if/while/do while/for循环语句
shell编程系列18--文本处理三剑客之awk动作中的条件及if/while/do while/for循环语句条件语句 if(条件表达式) 动作1 else if(条件表达式) 动作2 else 动 ...
- shell编程系列14--文本处理三剑客之awk的概述及常用方法总结
shell编程系列14--文本处理三剑客之awk的概述及常用方法总结 awk是一个文本处理工具,通常用于处理数据并生成结果报告 awk的命名是它的创始人 Alfred Aho.Peter Weinbe ...
- shell编程系列9--文本处理三剑客之sed概述及常见用法总结
shell编程系列9--文本处理三剑客之sed概述及常见用法总结 sed的工作模式:对文本的行数据一行行处理,如下图 sed(stream editor),是流编辑器,依据特定的匹配模式,对文本逐行匹 ...
- shell编程系列20--文本处理三剑客之awk常用选项
shell编程系列20--文本处理三剑客之awk常用选项 awk选项总结 选项 解释 -v 参数传递 -f 指定脚本文件 -F 指定分隔符 -V 查看awk的版本号 [root@localhost s ...
- shell编程系列17--文本处理三剑客之awk动作中的表达式用法
shell编程系列17--文本处理三剑客之awk动作中的表达式用法 awk动作表达式中的算数运算符 awk动作中的表达式用法总结: 运算符 含义 + 加 - 减 * 乘 / 除 % 模 ^或** 乘方 ...
- 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 ...
随机推荐
- Vue过渡效果的实现
1.Vue 过渡组件 Vue 在插入.更新或者移除 DOM 时,使用内置的过渡封装组件可以实现过渡效果 语法格式: <transition name = "xx"> & ...
- python算法与数据结构-冒泡排序算法(32)
一.冒泡排序介绍 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直到没有再需要 ...
- LOJ#3104「TJOI2019」甲苯先生的字符串
题目描述 一天小甲苯得到了一条神的指示,他要把神的指示写下来,但是又不能泄露天机,所以他要用一种方法把神的指示记下来. 神的指示是一个字符串,记为字符串 \(s_1\),\(s_1\) 仅包含小写字母 ...
- 项目(二)--完成练手feed流网站开发部署
样式需要优化,最简版,还需新增逻辑. 点击跳转 源码
- HTML5 Canvas 绘制图片不显示的问题
问题: 慕名赶来,却一脚踩空,低头一看,地上一个大坑. 事情是这样的,在我看完w3c的介绍和很有说服力和教学力的demo后,本着实践出真知的思想决定上手一试,这一试不要紧~ 我按照流水线工程铺设以下几 ...
- 2019-2020-1 20199301《Linux内核原理与分析》第四周作业
Week4 MenuOS的构造 一.上周复习 计算机的三大法宝: 存储程序计算机: 函数调用堆栈: 中断. 操作系统的两把宝剑: 中断上下文-保存现场和恢复现场 进程上下文 二.Linux内核源代码简 ...
- python读取excel的内容
import csvimport xlrdimport xlwt def handler_excel(filename=r'd:\\wu.xlsx'): # 打开文件 workbook = xlrd. ...
- linux第三天
一.用户的类型 1.root管理员:所有权限(r w x) 2.文件拥有者(u):谁创建谁拥有 3.组 (g):用户组 4.其它用户(o):不属于用户组,也不是文件的创建者,不是管理员 ...
- Kubernetes 学习15 kubernetes 认证及serviceaccount
一.概述 1.通过此前描述可以知道k8s是以后运行我们生产环境中重要应用程序的尤其是无状态程序的一个非常重要的平台.这里面能托管一些核心应用以及核心数据,很显然对于k8s对应接口的访问不是任何人都可以 ...
- regedit系统注册表,msconfig系统配置
msconfig msconfig即系统配置实用程序,是Microsoft System Configuration的缩写.是在开始菜单里运行中输入然后确认就可以找到程序开启或者禁用, 可以帮助电脑禁 ...