使用CAT或AWK读取文件以获得更好的执行时间

时间:2016-07-22 07:41:05

标签: bash time awk benchmarking cat

我有两个相同的脚本。其中一个是我用猫而另一个是AWK。

这是第一个:

#!/bin/bash


        lines=$(cat /etc/passwd | wc -l)

        for ((i=1 ; i <=$lines ; i++ ))
        do
        user=$(cat /etc/passwd | awk -F : -vi=$i 'NR==i {print $1}')
        uid=$(cat /etc/passwd | awk -F : -vi=$i 'NR==i {print $3}')
        gid=$(cat /etc/passwd | awk -F : -vi=$i 'NR==i {print $4}')
        shell=$(cat /etc/passwd | awk -F : -vi=$i 'NR==i {print $7}')
        echo -e "User is : $user \t Uid is : $uid \t Gid is : $gid \t Shell is : $shell"
        done

这是第二个:

#!/bin/bash


        lines=$(awk  'END {print NR}' /etc/passwd)

        for ((i=1 ; i <=$lines ; i++ ))
        do
        user=$(awk  -F : -vi=$i 'NR==i {print $1}' /etc/passwd)
        uid=$(awk  -F : -vi=$i 'NR==i {print $3}'  /etc/passwd)
        gid=$(awk  -F : -vi=$i 'NR==i {print $4}'  /etc/passwd)
        shell=$(awk  -F : -vi=$i 'NR==i {print $7}' /etc/passwd)
        echo -e "User is : $user \t Uid is : $uid \t Gid is : $gid \t Shell is : $shell"
        done

第一个脚本所用的时间如下(带有CAT语句的脚本):

real    0m0.215s
user    0m0.023s
sys     0m0.238s

对于只有AWK语句的第二个脚本,所用时间如下:

real    0m0.132s
user    0m0.013s
sys     0m0.123s

我认为与调用其他外部函数读取文件相比,awk处理文件要快得多。我很乐意讨论结果。

我认为AWK在某些情况下表现更好。

这是关于这个问题:

https://askubuntu.com/questions/564944/cat-vs-grep-vs-awk-command-get-the-file-content-which-one-is-more-efficient-and/801569#801569

1 个答案:

答案 0 :(得分:8)

显然:

lines=$(cat /etc/passwd | wc -l)

效率低于此:

lines=$(awk  'END {print NR}' /etc/passwd)

对于此大小的文件,与处理时间相比,执行每个过程的成本都很高。

但这两种方法都不是很好。如果您想获得文件的长度,只需使用wc -l < file

无论如何,你的循环可以更快地编写为像这样的单个awk程序:

awk -F: '{ 
  printf "User is : %s \t Uid is : %s \t Gid is : %s \t Shell is : %s\n", 
    $1, $3, $4, $7 
}' /etc/passwd

使用print代替printf,您可以获得更好的效果。

awk -F: '{ 
  print "User is : " $1 " \t Uid is : " $3 " \t Gid is : " $4 " \t Shell is : " $7
}' /etc/passwd