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 ...
随机推荐
- Contest1063 - 2017广东工业大学第一次月赛-部分题解
Problem A: Chiruno Description 五年前,Aerix 无意间飞到了幻想乡,然后遇到了传说中的⑨酱,心情非常激动,想和她合影留念,但是⑨酱比较傲娇,她只欣赏算数能力强的,也不 ...
- MarkDowm——语法篇
前言 文档地址: http://www.markdown.cn/ 为了自己更熟悉MarkDown的语法,做个练习吧,以后博文打算用MarkDown直接写了. 标题 Markdown 支持两种标题的语法 ...
- wait,waitpid学习测试
用man wait学习wait waitpid的使用 wait()函数功能:wait()函数使父进程暂停执行,直到它的一个子进程结束为止,该函数的返回值是终止运行的子进程的PID. 参数status所 ...
- BlockingCollection<T> 类实现 列队操作
官方文档 为实现 IProducerConsumerCollection<T> 的线程安全集合提供阻塞和限制功能. 通过 BlockingCollection<T> 实现列队调 ...
- ClickHouse 分布式高可用集群搭建(转载)
一.ClickHouse安装方式: 源码编译安装 Docker安装 RPM包安装 为了方便使用,一般采用RPM包方式安装,其他两种方式这里不做说明. 二.下载安装包 官方没有提供rpm包,但是Alti ...
- 流媒体知识 wiki
媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等.最近因为项目的关系,需要理清媒 ...
- word写博客
虽然很多博客已经可以直接粘贴图片了但是如果图片比较多的话还是会很麻烦的.如果文章中只有一张图片那还好说,直接使用CSDN提供的编辑器粘贴就完了.但是我们的文档中一般图片都是多于1张的,经常是10张.如 ...
- PHP安装之configure的配置参数
1.生成环境安装配置如下 要求安装如下库: imagickgdmysqlmysqlimysqlndphalconPharsoapsocketsxwebxsvczipzlib 具体查看 vim php- ...
- Day15:大前端
垂直水平居中 css: display: table-cell; text-align: center; vertical-align: middle; div: display: inline-bl ...
- (14)Go导入包几种方式
(1)一般方式[导入单个和多个] (2)匿名导入包/忽略包 (主要用到有些包的init函数) (3)点操作包 (4)包别名/自定义包名 package main ////导入单个包 //import ...