Chinaunix

标题: awk如何计算多个文件? [打印本页]

作者: zeikong    时间: 2013-05-14 19:17
标题: awk如何计算多个文件?
本帖最后由 zeikong 于 2013-05-15 09:11 编辑

先有多个日志文件 在 /log目录下

0416.log  0419.log  0422.log  0425.log  0428.log  0501.log  0504.log  0507.log
0417.log  0420.log  0423.log  0426.log  0429.log  0502.log  0505.log  0508.log
0418.log  0421.log  0424.log  0427.log  0430.log  0503.log  0506.log  0509.log

我想计算每个文件中百度蜘蛛访问的最后一列的平均值;

grep Baiduspider 0416.log | awk '{sum+=$NF} END {print "平均下载耗时=", sum/NR}'


这个是单个文件的计算!

如何批量计算???  更高效些,求大神解答~

输出时 一行对应一个文件,如下

0416 平均下载耗时 1000.98ms
0417 平均下载耗时 1000.98ms
0418 平均下载耗时 1000.98ms
作者: dn833    时间: 2013-05-14 20:14
  1. for i in $(ls *.log); do grep baiduspaider $i|后边一样;done
复制代码

作者: waker    时间: 2013-05-15 08:40
awk '/Baiduspider/{sum+=$NF} END {print "平均下载耗时=", sum/NR}' *.log
作者: zeikong    时间: 2013-05-15 10:57
回复 3# waker


    谢谢!!

不过计算出来 是全部加在一起的平均值;

求 、log下 批量计算 *.log 每一个文件的平均值
并输出如1楼的结果..
可实现?
作者: rdcwayx    时间: 2013-05-15 10:59
本帖最后由 rdcwayx 于 2013-05-15 13:00 编辑
  1. for file in *.log
  2. do
  3.   awk '/Baiduspider/{sum+=$NF} END {split(FILENAME,a,".");print a[1] , "平均下载耗时=", sum/NR}' $file
  4. done
复制代码

作者: zeikong    时间: 2013-05-15 13:54
回复 5# rdcwayx


    谢谢版主,很靠谱;由于用 awk /Baiduspider/ 匹配数据会有些出入,我还是改成grep这个样子了
  1. #!/bin/bash
  2. for file in *.log
  3. do
  4.   grep Baiduspider $file | awk  '{sum+=$NF} END {split(FILENAME,a,".");print a[1] , "平均下载耗时=", sum/NR}'
  5. done
复制代码
输出的结果文件名 输不出来了

输出是这样的..
- 平均下载耗时= 1022.36
- 平均下载耗时= 1032.55
- 平均下载耗时= 1018.06
- 平均下载耗时= 899.111
- 平均下载耗时= 864.094
- 平均下载耗时= 787.369
- 平均下载耗时= 801.767
- 平均下载耗时= 797.103
- 平均下载耗时= 801.994
- 平均下载耗时= 766.501


求用grep 能输出文件名!如下,学艺不精,打扰你们了,非常谢谢LS的大神们

0416 平均下载耗时= 797.103
0417  平均下载耗时= 801.994
0418 平均下载耗时= 766.501
....
作者: seesea2517    时间: 2013-05-15 14:38
  1. [seesea@UC xx]$ ls
  2. aaa.log  bbb.log

  3. [seesea@UC xx]$ head *
  4. ==> aaa.log <==
  5. Baiduspider 1
  6. xxx 2
  7. Baiduspider 3
  8. xxx 4

  9. ==> bbb.log <==
  10. xxx 1
  11. Baiduspider 2
  12. xx 3
  13. Baiduspider 50

  14. [seesea@UC xx]$ awk '/Baiduspider/ {name=FILENAME; sub(/.log/, "", name); count[name]++; sum[name] += $NF} END{for(i in sum) print i "平均下载耗时=", sum[i]/count[i]}' *.log
  15. aaa平均下载耗时= 2
  16. bbb平均下载耗时= 26
复制代码

作者: seesea2517    时间: 2013-05-15 14:40
回复 6# zeikong


    你这里 grep 输出以后用管道传给 awk,所以 awk 是得不到文件名的。除非你把文件名弄成输出的内容给 awk 解析啦,否则这个文件名就是 -.
作者: seesea2517    时间: 2013-05-15 14:42
回复 6# zeikong


    版主的那个出入是用了 NR 来做为平均值计算的除数了,这个 NR 包括非 baiduspider 行的计数。而你在前面 grep 后,NR 就是只包括匹配行的计数,所以两者的结果有不同。我这里另外增加一个数组进行匹配行计数就避免了这个问题。
作者: meteorcan    时间: 2013-05-15 15:41
本帖最后由 meteorcan 于 2013-05-15 15:49 编辑
  1. #/bin/bash

  2. flist=`find -name *.log`

  3. for i in $flist
  4. do      grep Baiduspider $i | awk '{sum+=$NF} END {print "平均下载耗时=", sum/NR}
  5. done
复制代码
写了一个脚本,flist是保存你那个目录下文件名称的列表,不知道对不对。
作者: zeikong    时间: 2013-05-15 18:05
回复 9# seesea2517


    非常感谢哇。!!测试成功了。o(︶︿︶)o 唉,自己学艺不精哇。真的感谢!
作者: seesea2517    时间: 2013-05-16 11:32
回复 11# zeikong


    过谦了,各人有各人所长嘛。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2