【问题标题】:Read files using CAT or AWK for better execution time [closed]使用 CAT 或 AWK 读取文件以获得更好的执行时间 [关闭]
【发布时间】:2026-01-12 09:30:01
【问题描述】:

我有两个相同的脚本。在其中一个我使用 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

【问题讨论】:

标签: bash time awk benchmarking cat


【解决方案1】:

很明显:

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

比这效率低:

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

对于这种大小的文件,与处理时间相比,执行每个进程的成本是显着的。

不过,这两种方法都不是很好。如果要获取文件的长度,只需使用wc -l &lt; 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

【讨论】:

  • 嗨,Tom,我同意以下内容会更好 'awk -F: '{ printf "User is : %s \t Uid is : %s \t Gid is : %s \t Shell 是 : %s\n", $1, $3, $4, $7 }' /etc/passwd' 我通常在问,与其他东西相比,使用函数的内置功能是否要好得多。例如,在 bash 的 for 循环中,我们有不同的方法:for (( i=1; i&lt;j; i++ )) ...kinf of syntax' we can also use #!/bin/bash for i in $(seq 5) do echo "Welcome $i times" done ` 这里我们使用 seq 作为增量一个外部命令。
  • @Himanshu 很难概括这种事情,但话又说回来,与在循环中调用外部程序的成本相比,每种方法之间的性能差异可能可以忽略不计。此外,使用设计用于处理整个文件的单个工具(例如 awk)在大多数情况下会比使用 shell 循环更快。
  • 感谢汤姆的回复。
最近更新 更多