我有两个相同的脚本。其中一个是我用猫而另一个是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在某些情况下表现更好。
这是关于这个问题:
答案 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