2011-12-12 35 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