2011-12-12 65 views
3

大家,我处理拥有约500万行日志文件,所以我用awk的外壳在linux关于awk的外壳和管在linux

我到grep域,并获得最高100日志,所以我写这样的:

  awk '{print $19}' $1 | 
      awk '{ split($0, string, "/");print string[1]}' | 
      awk '{domains[$0]++} END{for(j in domains) print domains[j], j}' | 
      sort -n | tail -n 100 > $2 

它运行约13秒

然后我改剧本是这样的:

  awk 'split($19, string, "/"); domains[string[1]]++} 
       END{for(j in domains) print domains[j], j}' $1 | 
      sort -n | tail -n 100 > $2 

它运行约21秒

为什么?

你知道的awk壳的一条线可以减少CAL的总和,它只能读取每一行一次,但时间的增加...

所以,如果你知道答案,告诉我

+0

哪个CPU和OS? – mouviciel

+0

以及你的输入数据是怎样的?你想要提取并保存什么信息? – Kent

+2

+1问题,研究和格式!你是否不止一次运行这个程序,或许是第二次运行时有高CPU任务运行?否则,我同意@rjack分裂工作改善表现。祝你好运:-) – shellter

回答

3

只要管道满了,管道命令就会并行运行。

所以我的猜测是,在第一个版本中,工作分布在你的CPU之间,而在第二个版本中,所有的工作都由一个内核完成。

您可以用top(或更好的,htop)验证此情况。


出于好奇,这是否更快? (未经测试):

cut -f 19 -d' ' $1 | cut -f1 -d'/' | sort | uniq -c | sort -nr | head -n 100 > $2 
+0

我预计它会变慢,因为'sort'步骤会触及很多内存(并且在500万行我希望它是物理内存),而'awk'只会触及大约_Number_of_different_domains_ *(_sizeof(number)_ + _average_sizeof_domain)_ – ninjalj

+0

啊..是的,它比较慢 – Flypig

+0

我还是有点困惑。你知道第二个awk的输入是第一个awk的输出,它们必须是一个顺序,它们是如何平行运行的?管道有多大?第二个awk开始处理未完成的输入? – Flypig