linux 下超级大日志文件统计问题,求 V 牛挤点儿奶来解渴!
- 0次
- 2021-07-05 01:10:18
- idczone
用一行很长 linux shell 脚本,从格式为“ uid,timestamp ”的 10G 大小的日志中抽取前天 4 点到 5 点间,访问用户最多的前 5 名的 uid 的列表。
求 V 友们给指引方向,谢谢,谢谢,谢谢!
方向是 cat | grep | awk
awk 具体统计用法自己查下 我记不清了
spark 应该就可以把
非常感谢,谢谢。
这不是常见面试题么……
10G 不算大吧……
先用`split`切成多个小文件,每个小文件用`awk`统计前天 4-5 点内的访问量,将每个文件的中间结果输出到临时文件,最后将临时文件求合计算出 top5 ((基本上是 MR 过程..
cat a.txt | awk -F, '$2 < 1433001600500 && $2> 1433001600000 {print $1}' | uniq -c | sort -k1,1nr | head -5
不知道大文件有没有问题
啊,两个时间戳替换掉。。。
少一步 cat 岂不是更好?
非常感谢,我试试看
非常感谢, cat 的话效率是个问题,内存负载压力很大吧,还是非常感谢
10G 一点也不多,给出一些方法
1.这里倒着读取日志,每次读取 10 万行,先搜索符合最后一天的日志(具体搜索算法可以用 bm 或者 kmp 反正数据量不大)记录一下尾部行号,然后接着往上读直到符合要求为止
2.bash 法,用 cat | xarg | unique | grep ""或 awk 这类
3.mysql 直接 loadfile ,建好索引,用 where 语句查询
4.mmap 读取大文件用 re2 写个 regex 匹配一下就好(内存可能会不够)
5.bozo 读取法(最神奇的算法),随机进行读取,然后记录一下,总有一天会完全读取完成的
觉得最省事的就是载入到 mysql 里面,如果你是嵌入式环境当我没说
spark 是处理实时流量,这个场景犯不上用那么大的家伙
v 站不能编辑真头疼,针对第一类可以采用半解析法,这样能更快速定位到行号
导入数据库吧
10G awk 毫无压力吧……
关键是 2 点:估计离文件头近还是尾近,当时间段过完之后(时间肯定是有序的啊)立刻退出,不要继续读文件了。
更高级的写法请用 seek ,跳跃式定位时间点(开始点),然后一直读到结束点。来个 awk 版本的:
awk -F, '$2>TIME_END{exit}$2>TIME_START{s[$1]++}END{for(i in a)print a[i],i}' FILE | sort -k1nr | head -5
这个只要你时间段内 uid 数量不过百万肯定没问题,主要是排序的开销
如果更接近文件末尾,用 tac FILE | awk 然后把 > < 条件改一下就好……
真不大。。
非常非常感谢,谢谢你给的思路,感谢!
谢谢,非常感谢,我看大家都提到了 awk,我好好研究一下,谢谢。
awk -F, '$NF>=1459281600&&$NF<=1459285200{a[$1]++}END{for(i in a){printf("%s\t%s\n",a[i],i)}}' abcd.txt | sort -rn | head -n 5
补充下, 如果字段不止两个的话你需要把$NF 替换成$2
perl flip flop 运算符轻松搞定
楼上正解
mmap 不存在内存不够啊………
除非地址空间不够,相信大家服务器都是 64 位了吧
谢谢,谢谢,受教了。
我理解可能有点问题,感谢指正
收一下 gmail ,有事找。