免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5817 | 回复: 14
打印 上一主题 下一主题

关于awk的字符变量包含特殊字符如"#" [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-12 17:38 |只看该作者 |倒序浏览
本帖最后由 daveyhook 于 2010-04-12 17:47 编辑

mysql的慢查询日志都是如下的格式:

# Time: 100322 10:16:01
# User@Host: aaa[aa] @  [192.168.3.12]
# Query_time: 3.782696  Lock_time: 0.000090 Rows_sent: 0  Rows_examined: 500036
SET timestamp=1269224161;
SELECT * FROM xx.yy WHERE mid='999999' AND mppstatus NOT IN (2,5,6,7,8,9,10,11,12);

我的目的是想把一天之内的慢查询重定向到一个文本,然后再用别的方法统计。红色部分应该怎么改呢?或者换一种方式?谢谢。

#!/bin/sh
export PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
TIME=100322
DATADIR=$(ps -ef | awk '(/mysql/ && /mysqld_safe/){print $10}' | awk -F"=" 'NR==1{print $2}')
BEGIN_TIME=$(grep "$TIME" $DATADIR/slow_queries | sed -n '2p')
END_TIME=$(grep "$TIME" $DATADIR/slow_queries | sed -n '$p')
awk '/$BEGIN_TIME/,/$END_TIME/' $DATADIR/slow_queries > /slow.log

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
2 [报告]
发表于 2010-04-12 17:43 |只看该作者
单引号换成双引号

论坛徽章:
0
3 [报告]
发表于 2010-04-12 17:51 |只看该作者
本帖最后由 ywlscpl 于 2010-04-12 17:53 编辑

筛选
  1. awk -v s="$BEGIN_TIME" -v e="$END_TIME" -v RS='# Time: [0-9][0-9][0-9][0-9][0-9][0-9]' '{split(v,m," +")}m[3]>=s&&m[3]<=e{printf v""$0}{v=RT}' file
复制代码
筛选出来要统计什么?

论坛徽章:
0
4 [报告]
发表于 2010-04-12 17:56 |只看该作者
哪个单引号?谢谢。
是这样的格式
[root@db3 ~]# echo $BEGIN_TIME
# Time: 100322 0:00:02

[root@db3 ~]# echo $END_TIME
# Time: 100322 10:16:01

我的意思是把这对字符窜之间的所有内容都重定向到另外一个文件。还有别的快捷的办法么?

论坛徽章:
0
5 [报告]
发表于 2010-04-12 18:03 |只看该作者
回复 4# daveyhook

如果每段之间有一个空行的,可以这样
  1. awk -F '\n' -v s="$BEGIN_TIME" -v e="$END_TIME" -v RS= '{v=$1;split(v,m," +")}m[3]>=s&&m[3]<=e' file
复制代码

论坛徽章:
0
6 [报告]
发表于 2010-04-12 18:07 |只看该作者
回复 4# daveyhook


    晕,以为你的BEGIN_TIME格式是100322

论坛徽章:
0
7 [报告]
发表于 2010-04-12 18:10 |只看该作者
我再看看。
我的目的很简单呢,就是把每天的mysql慢查询独立出来。暂时不知道有啥办法。听说Mysql自带工具可以分割每天的慢查询日志的?

论坛徽章:
0
8 [报告]
发表于 2010-04-12 18:31 |只看该作者
$BEGIN_TIME  $END_TIME格式是:
# Time: 100322 0:00:02
  1. awk -v s="$BEGIN_TIME" -v e="$END_TIME" -v RS='# Time: [0-9][0-9][0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]' 'function cal(tm) {split(tm,m,"[ :]+");return mktime("20"substr(m[3],1,2)" "substr(m[3],3,2)" "substr(m[3],5,2)" "m[4]" "m[5]" "m[6])}BEGIN{s1=cal(s);e1=cal(e)}{time=cal(v)}time>=s1&&time<=e1{printf v$0}{v=RT}' file
复制代码

论坛徽章:
0
9 [报告]
发表于 2010-04-12 18:37 |只看该作者
如果每段之间是有空行分隔的
  1. awk -F '\n' -v s="$BEGIN_TIME" -v e="$END_TIME" -v RS= 'function cal(tm) {split(tm,m,"[ :]+");return mktime("20"substr(m[3],1,2)" "substr(m[3],3,2)" "substr(m[3],5,2)" "m[4]" "m[5]" "m[6])}BEGIN{s1=cal(s);e1=cal(e)}{time=cal($1)}time>=s1&&time<=e1' file
复制代码

论坛徽章:
0
10 [报告]
发表于 2010-04-12 20:11 |只看该作者
本帖最后由 daveyhook 于 2010-04-12 20:12 编辑

谢谢ywlscpl。
最终我弄成了这样。。。
  1. #!/bin/sh
  2. export PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
  3. BEGIN_TIME=100321
  4. DATADIR=$(ps -ef | awk '(/mysql/ && /mysqld_safe/){print $10}' | awk -F"=" 'NR==1{print $2}')
  5. END_TIME=100322
  6. #awk '"$BEGIN_TIME","$END_TIME"' $DATADIR/slow_queries > /slow.log
  7. LANG=C awk '/# Time: '$BEGIN_TIME'/,/# Time: '$END_TIME'/{print}' $DATADIR/slow_queries
复制代码
ywlscpl那个弄起来,查不到我想要的结果,会有09年的慢查询出现,暂时不知道啥原因,不过还是谢谢你。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP