对于任何精通 bash/sed/awk 的人来说,这应该是一个微不足道的问题。不幸的是,我还没有:)
我从 MySQL 获得了一个通用日志,其中包含一些具有公共(public)参数的查询,它们查询特定的 id 字段。 查询看起来像
update tbl set col='binary_values' where id=X;
我需要处理日志并提取这些查询涉及的所有 ID,每个 ID 都在其自己的行中。 这样做的目的是计算出每个ID被访问了多少次。最终我会分组并计算这些值。 二进制值确实是二进制垃圾,所以它们有点搞砸了我一直试图做的一些事情。
最终我们使用 python 脚本暂时解决了这个问题,但我相信 linux 命令行工具集也可以做到。你会怎么做?
更新(日志中的查询示例):
5999 Query update tbl set col='<AC><ED>\0^Ez\0\0^AaESC\0\0\0^D}k<85><F4>\0\0
c\0\0\0\0\0\0\0\0\0\0\0\0\0^A\0\0\0^A\0^A\0\0\0^A\0^A\0\0\0^A\0\0\0\0\0\0\0\0\0\0\0^A\0\0\0^Z^E^A<F6><DE>^A\0^A<F7><DE>^A\0^A<F8><DE>^A\0^A<F9><DE>^A\0^A<FE><DE>^A\0\0\0\0\0^A\0\0\0Q^E^C<C4>^O^A\0?<80>\0\0\0�°<C2><EA><D2>%^C<CB>^O^A\0?<80>\0\0\0�«<9C><CD><CC>%^C<EA>^Y^A\0?<80>\0\0\0�°<C2><EA><D2>%^C<90>^L^A\0?<80>\0\0\0�°<C2><EA><D2>%^C<F6>^L^A\0?<80>\0\0\0�«<9C><CD><CC>%\0^A\0\0\0T^E^D^A\0^A<83><D2>|^A<C4>^O\0�<D3>�³%^D^B\0^A�<B5>^B^A<F5>^K^A^R�<B2>�³%^D^A\0^A<FA>^L\0\0<AE><96><B1>�³%^D^A\0^A<F7>^W^A<90>^L^AESC<96><FC><B1>�³%^D^A\0^A^T^A<EA>^Y^A^F<F5>�±�³%\0\0\0\0\0\0\0^A\0\0\0^U^A^B\0\0\0\0\0\0^O9\0\0^A+<<87>u<E0>^A<85>^B^A\0\0\0^_^B^A^F^A\0?<80>\0\0\0�°<C2><EA><D2>%^AESC^A\0?<80>\0\0\0�°<C2><EA><D2>%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0' where id=19284067828
二进制垃圾包含换行符和“=”字符,使“剪切”更难使用。
最佳答案
根据您的示例日志条目,这可能有效:
sed -n 's/.*update tbl set col=.*where id=\([0-9]\+\)$/\1/p' file.log
要计算每个 id 的出现次数,您可以将输出通过管道传输到 sort
和 uniq
sed -n 's/.*update tbl set col=.*where id=\([0-9]\+\)$/\1/p' file.log | sort | uniq -c
关于mysql - 如何使用 linux 命令行提取从 mysql 通用日志访问的所有 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4647984/