在我使用的Linux服务器上,进程以随机间隔写入随机命名的文件。这是一个小样本,显示文件大小,修改日期和时间。时间和文件名:
27659 2009-03-09 17:24 APP14452.log
0 2009-03-09 17:24 vim14436.log
20 2009-03-09 17:24 jgU14406.log
15078 2009-03-10 08:06 ySh14450.log
20 2009-03-10 08:06 VhJ14404.log
9044 2009-03-10 15:14 EqQ14296.log
8877 2009-03-10 19:38 Ugp14294.log
8898 2009-03-11 18:21 yzJ14292.log
55629 2009-03-11 18:30 ZjX14448.log
20 2009-03-11 18:31 GwI14402.log
25955 2009-03-12 19:19 lRx14290.log
14989 2009-03-12 19:25 oFw14446.log
20 2009-03-12 19:28 clg14400.log
(请注意,有时文件大小可以为零。)
我想要的是一个bash脚本来总结文件的大小,按日期细分,产生类似的输出(假设我的算术是正确的):
27679 2009-03-09
33019 2009-03-10
64527 2009-03-11
40964 2009-03-12
结果将显示一段时间内的活动趋势,并突出显示异常繁忙的日子。
在SQL中,操作很简单:
SELECT SUM(filesize), filedate
FROM files
GROUP BY filedate;
现在,这在Perl或Python中可能都很简单,但我真的更喜欢bash shell或awk解决方案。在bash中按日期对文件进行分组似乎特别棘手(特别是如果你不能假设特定的日期格式)。总结大小可以在我想的循环中完成,但是有更简单,更优雅的方法吗?
答案 0 :(得分:15)
我经常使用Awk这个成语:
awk '{sum[$2]+= $1;}END{for (date in sum){print sum[date], date;}}'
答案 1 :(得分:8)
(find ... | xargs stat“--printf =%s +”; echo 0)| BC
答案 2 :(得分:5)
仅递归文件,按日期排序并总结
find ./ -type f -printf '%TY-%Tm-%Td %s\n'|awk '{sum[$1]+= $2;}END{for (date in sum){print date, sum[date];}}'|sort
仅限当前目录中的文件,按日期排序并总结
find ./ -maxdepth 1 -type f -printf '%TY-%Tm-%Td %s\n'|awk '{sum[$1]+= $2;}END{for (date in sum){print date, sum[date];}}'|sort
答案 3 :(得分:2)
根据ashawley和vartec的建议,下面的“单行”可以很好地解决这个问题:
ls -l --time-style=long-iso *log |
awk '{sum[$6]+= $5;}END{for (s in sum){print sum[s], s;}}' |
sort -k2 |
column -t
答案 4 :(得分:1)
考虑一下在Linux上你可能有GNU awk, 所以你不需要其他命令:
ls -l --time-style=long-iso * |
WHINY_USERS=-9 awk 'END {
for (s in sum)
printf "%-15s\t%s\n", sum[s], s
}
{ sum[$6]+= $5 }
'
答案 5 :(得分:0)
我创建了一个工具,允许对文本数据执行类似SQL的查询,包括分组,连接,条件和其他内容。您可以查看here了解详细信息。