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

2015-11-03 17:10:14 +08:00
 snopy

我服务器上有统计数据量的文本 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 来实现,但是各种折腾还是没能成功,希望得到大神的指点,谢谢(本人非伸手党,折腾来折腾去实在没办法才来请教,不耻下问才会进步)

3227 次点击
所在节点    程序员
15 条回复
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
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
2015-11-03 17:25:29 +08:00
"不耻下问"?! 哈哈 语死早
tonic
2015-11-03 17:26:56 +08:00
@holyzhou 我就知道有人要吐槽...
snopy
2015-11-03 17:28:24 +08:00
@joyeblue @ri0day 感谢,你们的方法有异曲同工之妙,受教了
Orzpls
2015-11-03 18:43:24 +08:00
不耻下问⊙_⊙
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
2015-11-03 21:42:19 +08:00
@402124773 sum=$(($sum+$a))这个为什么是双括号呢? print "$a" 应该是 print "$sum"吧
402124773
2015-11-03 22:13:16 +08:00
@snopy 嗯,双括号用来计算
lululau
2015-11-03 22:23:04 +08:00
在算数替换里面进行变量替换时,$ 符号可以省略,如:

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

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


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

一次一个长辈在教导我的时候说,“你要不耻下问,遇到不会的问题就去问老师,不要不好意思”。
世界观崩塌~
xiamingchong
2015-11-04 09:43:43 +08:00
awk 'BEGIN{total=0} { total+=$4} END {print total}' log.log 就这么简单
snopy
2015-11-04 11:29:56 +08:00
@Orzpls @Orzpls 看来我以后得改个说法:不耻上问

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/233306

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX