免费注册 查看新帖 |

Chinaunix

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

问个shell和awk相关的问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-27 01:01 |只看该作者 |倒序浏览
发现个问题,把几行命令写到一个脚本文件里面执行,和用for循环执行居然效果不同。
写了好多行命令时输出正常;用for循环执行的输出时是错误的数据。

下面具体说明:
需求:
想查看apache日志中00:00:00到00:59:59间的记录的总行数。
PS:有这个需求的原因是最近日志分期出了问题,访问量波动巨大。
我的思路:
想到用awk '/00:00:00/' log | wc >> wc.txt的方法找到00:00:00访问的记录的行数,然后1秒1秒的逐个运行之后再相加等等。
遇到的问题:
在一个script.ch中写入如下内容时,可以正常的看到wc.txt里面有好多行,每行都会显示正常的数字,和单独运行一个awk命令是一样的没有问题。
awk '/00:00:00/' log | wc >> wc.txt
awk '/00:00:01/' log | wc >> wc.txt
在script.ch中写入如下内容时,看到wc.txt里面也有好多行,但是每行的数字都是零这肯定是不对的。
for ((a=0;a<=1;a++));
do
awk '/00:00:0$a/' log | wc >> wc.txt;
done
高手看看是咋了吧。
PS:刚开始看shell编程不久。

[ 本帖最后由 sharkyan 于 2008-12-27 01:03 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-12-27 04:43 |只看该作者
grep "00:[0-59]:[0-59]"| wc -l

论坛徽章:
0
3 [报告]
发表于 2008-12-27 07:42 |只看该作者
awk '/00:00:0'$a'/' log | wc >> wc.txt;


awk 里不能直接使用变量,要加单引号

论坛徽章:
0
4 [报告]
发表于 2008-12-27 10:14 |只看该作者
原帖由 codfei 于 2008-12-27 04:43 发表
grep "00:[0-59]:[0-59]"| wc -l



[0-59]在 表达式里可不代表0-59这些个数字

论坛徽章:
0
5 [报告]
发表于 2008-12-27 10:58 |只看该作者
awk "/00:00:0$a/" log | wc >> wc.txt;

论坛徽章:
0
6 [报告]
发表于 2008-12-27 11:06 |只看该作者
两条命令吧:

awk '/00:00:00/,/00:59:59' filename|wc -l
awk '/00:59:59/' filename|wc -l
把上面两个结果相加减一应该就对了

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
7 [报告]
发表于 2008-12-28 00:56 |只看该作者
原帖由 welcome008 于 2008-12-27 11:06 发表
两条命令吧:

awk '/00:00:00/,/00:59:59' filename|wc -l
awk '/00:59:59/' filename|wc -l
把上面两个结果相加减一应该就对了

这样行不? 没测试
  1. awk '/00:00:00/,/01:00:00/{ln++}END{print ln-1}' filename
复制代码

论坛徽章:
0
8 [报告]
发表于 2008-12-28 16:59 |只看该作者
日志中'/00:00:00/'的记录有46条,'/00:00:01/'的记录有10条。
这些是用awk '/00:00:00/' log | wc -l看到的。

2楼的方法我改成:grep "00:00:[0-01]"| wc -l显示有257条。--没有成功。
3楼的方法成功了,加上单引号之后单引号之间的$a变成了蓝色;稍微的运行了一会儿,出来的是46、10……应该是正确的数据了。
6楼的方法需要等我知道了正确的数字之后才能确定这个方法是否是对的。
7楼方法同样需要等我知道了正确的数字之后才能确定这个方法是否是对的。

不过发现这个方法对磁盘和CPU的消耗都很大。
现阶段先搞出来,以后再考虑性能问题。

[ 本帖最后由 sharkyan 于 2008-12-28 17:10 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2008-12-28 17:20 |只看该作者
原帖由 sharkyan 于 2008-12-28 16:59 发表
日志中'/00:00:00/'的记录有46条,'/00:00:01/'的记录有10条。
这些是用awk '/00:00:00/' log | wc -l看到的。

2楼的方法我改成:grep "00:00:[0-01]"| wc -l显示有257条。--没有成功。
3楼的方法成功了, ...

楼主是个认真的好同学

论坛徽章:
0
10 [报告]
发表于 2008-12-29 13:51 |只看该作者
这个写法要读取文件3600次,现在CPU:95%、硬盘不停的读;上午10点到现在(13:51)还在跑。
不知道什么时候才能完。

16:00
突然想看看别的办法是否成功
7楼的方法试了一下看是1,也失败了。
6楼的方法成功了。单独awk '/00:00:00/' log|wc -l了00-05的,逐个相加后发现和6楼方法出来的数是一样的。
终于不用循环3600次了。虽然还不知道原理是啥。(*^__^*)

最后采用了:
awk '/00:00:00/,/00:59:59/' log|wc -l
awk '/00:59:59/' log|wc -l
把上面两个结果相加减一

[ 本帖最后由 sharkyan 于 2008-12-29 16:37 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP