mysql - 如何使用 linux 命令行提取从 mysql 通用日志访问的所有 ID?

标签 mysql bash command-line sed awk

对于任何精通 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 的出现次数,您可以将输出通过管道传输到 sortuniq

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/

相关文章:

php - 插入Mysql表中的特定列

mysql - phpMyAdmin 没有正确计算行数

bash - 如何在 ubuntu 的 bashrc 文件中添加新行?

node.js - 在不使用额外的 NPM 包的情况下检查 package.json 是否在 shell 脚本中具有特定名称的脚本

macos - Sublime Text 3 和 OS X Mavericks 的终端提示符?

php - 仅当某个字段不为空时才从 MySQL 中拉取数据

MySQL 查询返回奇怪的结果

bash - 如果已经设置了别名,我如何检查我的 bashrc

visual-studio - Visual C++ 命令行编译器 (CL.EXE) 重定向 OBJ 文件

php - 从命令行运行 PHP 是否需要 #!/usr/bin/env?