免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2276 | 回复: 8
打印 上一主题 下一主题

请教大家像这个文本比较的shell该怎么写? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-29 22:20 |只看该作者 |倒序浏览
1.txt 的内容如下
gei_1/1 is up,  line protocol is up
  Interface utilization: input      14%,     output       9%

gei_1/2 is down,  line protocol is down
  Interface utilization: input       0%,     output       0%

gei_1/3 is up,  line protocol is up
  Interface utilization: input       10%,     output       10%

2.txt的内容如下
gei_1/1 is up,  line protocol is up
  Interface utilization: input       5%,     output       3%

gei_1/2 is down,  line protocol is down
  Interface utilization: input       0%,     output       0%

gei_1/3 is up,  line protocol is up
  Interface utilization: input       20%,     output       30%

我想定义一个规则:即如果前后端口流量相差50%,就报告异常,放在3.txt
********exceptional interface********
                input1  output2   input2 output2        discrepancy
gei_1/1    14%       9%          5%       3%                 -65%             <-----------------(算法:14+9-5-3/14+9)
gei_1/2      0%       0%          0%       0%                   --
ge_1/3      20%     20%        20%     30%                +25%            <-----------------(算法:20+30-20-20/20+20)

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2009-03-30 08:15 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2009-03-30 10:15 |只看该作者
我把文本现简化了
  1. [root@lg awk]# cat file1
  2. gei_1/1 up input 10 output 20
  3. gei_1/2 down input 0 output 0
  4. gei_1/3 up input 10 output 20
  5. [root@lg awk]# awk 'NR==FNR{a[$1]=$4;b[$1]=$6}NR>FNR{c[$1]=$4;d[$1]=$6;if(/up/)e[$1]=((a[$1]+b[$1]-c[$1]-d[$1])/(a[$1]+b[$1]))*100;else e[$1]=0}END{for(i in a)print i,a[i],b[i],c[i],d[i],e[i]}' file1 file2
  6. gei_1/1 10 20 20 40 -100
  7. gei_1/2 0 0 0 0 0
  8. gei_1/3 10 20 10 50 -100
复制代码

论坛徽章:
0
4 [报告]
发表于 2009-03-30 13:26 |只看该作者

回复 #3 ubuntuer 的帖子

我还真想看看如果不简化文本怎么来实现,呵呵!

论坛徽章:
0
5 [报告]
发表于 2009-03-30 14:21 |只看该作者
  1. [root@Mylinux tmp]# awk -F 'input|output|,' '/line protocol/{v=gensub(/(.*) is(.*)/,"\\1",1,$1)}/Inter/{if (NR==FNR) {a1[v]=$2;a2[v]=$4}else {b1[v]=$2;b2[v]=$4}}END{for (i in a1) if (a1[i]+0&&a2[i]+0) {v1=(b1[i]+b2[i]-a1[i]-a2[i])*100/(a1[i]+a2[i]);if (v1<-50||v1>50) print i,a1[i],a2[i],b1[i],b2[i],v1"%"}else print i,a1[i],a2[i],b1[i],b2[i],"--"}' file1 file2
  2. gei_1/1       14%        9%        5%        3% -65.2174%
  3. gei_1/2        0%        0%        0%        0% --
  4. gei_1/3        10%        10%        20%        30% 150%
复制代码

[ 本帖最后由 ywlscpl 于 2009-3-30 14:40 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-03-30 14:44 |只看该作者

回复 #5 ywlscpl 的帖子

楼上的再来个代码解析就完美了!

论坛徽章:
0
7 [报告]
发表于 2009-03-30 15:27 |只看该作者

回复 #6 linuxboy823 的帖子

  1. awk -F 'input|output|,'   #以input、output、以及,做分隔符,这样端口流量分别是$2和$4
  2. '/line protocol/{v=gensub(/(.*) is(.*)/,"\\1",1,$1)}  #变量v值为接口名称
  3. /Inter/{if (NR==FNR) {a1[v]=$2;a2[v]=$4}    #读第一个文件时,把端口流量内容复制到数组a1、a2
  4. else {b1[v]=$2;b2[v]=$4}}  #读第二个文件时,数组b1、b2
  5. END{for (i in a1) if (a1[i]+0&&a2[i]+0)   #前端口流量都不为0
  6. {v1=(b1[i]+b2[i]-a1[i]-a2[i])*100/(a1[i]+a2[i]);    #变量v1为流量差百分比
  7. if (v1<-50||v1>50) print i,a1[i],a2[i],b1[i],b2[i],v1"%"}  #v1绝对值大于50打印相关内容,取绝对值应该有个函数
  8. else print i,a1[i],a2[i],b1[i],b2[i],"--"}' file1 file2  #前端口流量为0的情况打印--
复制代码

论坛徽章:
0
8 [报告]
发表于 2009-03-30 17:21 |只看该作者

回复 #7 ywlscpl 的帖子

这位大侠好厉害.什么时候我能看懂,我也是大牛啦

论坛徽章:
0
9 [报告]
发表于 2009-03-30 21:14 |只看该作者

回复 #7 ywlscpl 的帖子

太厉害了  不愧是光明使者
同时感谢老法王对我们这些菜鸟不厌其烦的指导!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP