关于linux中的awk shell和管道

时间:2011-12-12 13:03:27

标签: linux shell awk

每个人,我正在处理一个大约有500万行的日志文件,所以我在linux中使用awk shell

我必须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 shell可以减少cal的总和,它只读取每一行,但时间增加...

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

1 个答案:

答案 0 :(得分:3)

管道命令时,只要管道已满,它们就会并行运行。

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

您可以使用top(或更好,htop)来验证这一点。


出于好奇,这会更快吗? (另):

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