V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
snopy
V2EX  ›  程序员

[shell] 如何用 awk 从文本中过滤出数据进行叠加

  •  
  •   snopy · 2015-11-03 17:10:14 +08:00 · 3229 次点击
    这是一个创建于 3309 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我服务器上有统计数据量的文本 today_count.log ,内容如下:

    file_numb: 3168; total_size: 105.801 GB;avg_size: 34.1983 MB
    file_numb: 3154; total_size: 87.16 GB;avg_size: 28.298 MB
    file_numb: 348; total_size: 140.047 GB;avg_size: 412.091 MB
    file_numb: 306; total_size: 184.478 GB;avg_size: 617.339 MB
    file_numb: 3168; total_size: 371.135 GB;avg_size: 119.963 MB
    file_numb: 2427; total_size: 0.00790029 GB;avg_size: 0.00333329 MB
    file_numb: 3146; total_size: 138.763 GB;avg_size: 45.1663 MB

    我每天需要统计数据总量大小,即将上面文本里 total_size 后面的数字加起来得出总量,本来想用 awk 来实现,但是各种折腾还是没能成功,希望得到大神的指点,谢谢(本人非伸手党,折腾来折腾去实在没办法才来请教,不耻下问才会进步)

    15 条回复    2015-11-04 11:29:56 +08:00
    ri0day
        1
    ri0day  
       2015-11-03 17:16:53 +08:00
    MacBook-Pro:~ min$ cat 2.txt
    file_numb: 3168; total_size: 105.801 GB;avg_size: 34.1983 MB
    file_numb: 3154; total_size: 87.16 GB;avg_size: 28.298 MB
    file_numb: 348; total_size: 140.047 GB;avg_size: 412.091 MB
    file_numb: 306; total_size: 184.478 GB;avg_size: 617.339 MB
    file_numb: 3168; total_size: 371.135 GB;avg_size: 119.963 MB
    file_numb: 2427; total_size: 0.00790029 GB;avg_size: 0.00333329 MB
    file_numb: 3146; total_size: 138.763 GB;avg_size: 45.1663 MB

    MacBook-Pro:~ min$ awk '{sum+=$4} END {print "total = ", sum}' 2.txt
    total = 1027.39
    joyeblue
        2
    joyeblue  
       2015-11-03 17:18:05 +08:00
    awk -F ";" '{ gsub("total_size:","", $2); gsub("GB", "", $2); total+=$2} END { print total}' today_count.log
    holyzhou
        3
    holyzhou  
       2015-11-03 17:25:29 +08:00
    "不耻下问"?! 哈哈 语死早
    tonic
        4
    tonic  
       2015-11-03 17:26:56 +08:00
    @holyzhou 我就知道有人要吐槽...
    snopy
        5
    snopy  
    OP
       2015-11-03 17:28:24 +08:00
    @joyeblue @ri0day 感谢,你们的方法有异曲同工之妙,受教了
    Orzpls
        6
    Orzpls  
       2015-11-03 18:43:24 +08:00 via Android
    不耻下问⊙_⊙
    402124773
        7
    402124773  
       2015-11-03 21:30:03 +08:00
    我对 awk 的语法不是特别熟悉,一般情况下,我都会:
    for a in `awk -F '{print $4}' filename`;do sum=$(($sum+$a));done
    print "$a"
    这个可以手打,不用记住
    snopy
        8
    snopy  
    OP
       2015-11-03 21:42:19 +08:00
    @402124773 sum=$(($sum+$a))这个为什么是双括号呢? print "$a" 应该是 print "$sum"吧
    402124773
        9
    402124773  
       2015-11-03 22:13:16 +08:00 via Android
    @snopy 嗯,双括号用来计算
    lululau
        10
    lululau  
       2015-11-03 22:23:04 +08:00
    在算数替换里面进行变量替换时,$ 符号可以省略,如:

    a = 3
    b = 2
    echo $((a * b)) # => 输出 6
    lululau
        11
    lululau  
       2015-11-03 22:23:32 +08:00
    纠正。。。

    a=3
    b=2
    echo $((a * b))
    402124773
        12
    402124773  
       2015-11-03 22:54:29 +08:00
    @lululau
    多谢提醒, shell 脚本我没那么熟悉,平时只是用来做简单的数据处理,常用的命令也就是 for a in 循环, awk 打印和 sed 做替换以及一些简单的正则,呵呵
    ScotGu
        13
    ScotGu  
       2015-11-03 23:09:50 +08:00
    不耻下问_百度词典
    不耻下问 [bù chǐ xià wèn]
    [解释] 乐于向学问或地位比自己低的人学习,而不觉得不好意思。
    [出自] 《论语·公冶长》:“敏而好学,不耻下问。”


    貌似有部分人认为 不以问简单的问题而感到羞耻。
    还有部分人认为是 不以多次提问同样的问题而感到羞耻。

    一次一个长辈在教导我的时候说,“你要不耻下问,遇到不会的问题就去问老师,不要不好意思”。
    世界观崩塌~
    xiamingchong
        14
    xiamingchong  
       2015-11-04 09:43:43 +08:00
    awk 'BEGIN{total=0} { total+=$4} END {print total}' log.log 就这么简单
    snopy
        15
    snopy  
    OP
       2015-11-04 11:29:56 +08:00
    @Orzpls @Orzpls 看来我以后得改个说法:不耻上问
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2968 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:38 · PVG 22:38 · LAX 06:38 · JFK 09:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.