1

用awk做基本运算

 2 years ago
source link: https://www.qikqiak.com/post/awk-base-compute/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

awk是非常强大的文本处理工具,之前经常见到脚本里面有使用,但是没有自己完完整整来写过awk命令。正好今天公司里有一个非常的大的日志文件需要分析。需求是将日志文件中记录的耗时时间评价值、最大值、最小值计算出来。日志的格式如下:

[2016-03-30 00:02:02,475] [17243] [140344433927936] [MainThread] [tasks.py:733] DEBUG [upload to oss] upload file /data/image5/user_upload_image/20160330/00/1458483897397580_101183475_1459267295740.jpg to oss cost time 28 ms

其中的数字28就是我们需要统计的呃数据。

awk用法

数据28按照空格’ ‘分割过后是第18位,所以在命令里面用$18就能获取到对应的数据了,如下

cat elfin_celery.log.2016-03-29|grep 'cost'|awk 'BEGIN {sum=0}{sum+=$18}END{print "avg=",sum/NR}'
avg= 31.5155ms

其中NR表示总的行数。该命令计算出评价值是完完全全没有问题的。但是在计算最小值的时候:

cat elfin_celery.log.2016-03-29|grep 'cost'| awk 'BEGIN {min = 199999}{if ($18<min) min=$18 fi} END {print "min=",min}'
min=100

计算出来却始终是100,按同样的方法计算最大值是999,这显然和评价值不符,而且我查看了日志里面有很多小于100的数据,所以肯定是计算有误。

后面用如下排序命令查看了下结果:

cat elfin_celery.log.2016-03-29|grep 'oss cost'|awk '{print $18}'|sort|less

结果是100在20的前面,这肯定不符合要求。原来这是因为默认情况下,awk是按字符串方式进行比较的,但我们这里是想让其按照数字的方式进行比较,所以为了能正确获取到最大值,需要让awk按数字的方式去比较,在比较前需要先将变量强制转换为整数型,这样获取到的最大值才会是正确的。

cat elfin_celery.log.2016-03-29|grep 'cost' |awk 'BEGIN {min=19999} {if ($18+0 < min + 0) min=$18 fi}END{print "Min=",min}'
Min=13ms

cat elfin_celery.log.2016-03-29|grep 'oss cost time'|awk 'BEGIN {max=0}{if($18+0>max+0)max=$18 fi}END{print "Max=",max}'
max=3051ms

这里可以看到在比较前对两个变量先加0(两个变量需要同时做转换,不然也得不到预期效果),就相当于是做从字符串到数字类型的转换操作。

微信公众号

扫描下面的二维码关注我们的微信公众帐号,在微信公众帐号中回复◉加群◉即可加入到我们的 kubernetes 讨论群里面共同学习。

wechat-account-qrcode

「真诚赞赏,手留余香」


Recommend

  • 46
    • blog.51cto.com 6 years ago
    • Cache

    AWK-ZeroReb的博客-51CTO博客

    强大的AWKAWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。awk经过改进生...

  • 37
    • blog.51cto.com 6 years ago
    • Cache

    AWK的使用-smallgraygray的博客

    一、AWK介绍&emsp;&emsp;Linux文本处理工具三剑客:grep、sed和AWK。其中grep是一种文本过滤工具,sed是文本行编辑器,而AWK是一种报表生成器,就是对文件进行格式化处理,这里的格式化不是文件系统的格式化,而是对文件内容进行各种“排版”,进而格式化显...

  • 37
    • www.tuicool.com 6 years ago
    • Cache

    GoAWK: an AWK interpreter written in Go

    GoAWK: an AWK interpreter written in Go AWK is a fascinating text-processing language, and somehow after reading the delightfully-terse

  • 39
    • www.theunixschool.com 6 years ago
    • Cache

    The UNIX School: awk & sed

    --> awk and sed tutorials: awk: awk - Read and split file contents awk - Passing arguments or shell variables to awk awk - Match a pat...

  • 42
    • studygolang.com 5 years ago
    • Cache

    二叉树的基本运算2

    这一篇是接上一篇文章 二叉树的基本运算 二叉树的遍历 二叉树遍历分为三种:前序、中序、后序: 前序遍历:根结点 -> 左子树 -&g...

  • 4
    • wiki-power.com 3 years ago
    • Cache

    基本元器件 - 运算放大器

    基本元器件 - 运算放大器参考与致谢#

  • 4

    为什么要转载这篇文章?别问,问就是物竞考到了但不会。 运算放大器电路图标:Vp:同相输入端Vn:反向输入端Vo:输出端 1.同相输入端与反向输入端的意义Vp Vn Vo 上升 接地或稳定的...

  • 4
    • mathpretty.com 2 years ago
    • Cache

    Bash 基本运算

    Bash 基本运算 2022年2月20日07:00:36评论2034字阅读6分46秒 摘要本文主要是介绍 Bash 中的运算命令(ex...

  • 6
    • keelii.com 2 years ago
    • Cache

    关系代数的基本运算

    关系代数的基本运算2017/2/19首页

  • 6

    四元数Quaternion的基本运算 - DECHIN - 博客园 在前面一篇文...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK