用bash内置函数替换awk

时间:2014-02-14 14:30:35

标签: linux bash shell awk

我被告知要写一个bash脚本,用于添加所有GroupID" / etc / passwd "文件,这是我的文件

 #!/bin/sh
 # script input should be (sh groupsum.sh /etc/passwd)

 if [ -f $1 ] ; then
     awk -F ':' '{print $4}' $1 > /tmp/numb
     A=`awk '{s+=$1} END {print s}' /tmp/numb`
     echo $A
 else
     echo "its not a file"
 fi

脚本运行正常但是为了加快速度我应该使用bash内置命令而不是使用" awk "。因此,我需要使用内置命令来实现这一点,如果有人对此进行解释,那将是很好的。

1 个答案:

答案 0 :(得分:3)

你说“bash内置插件”,但你的脚本以#!/bin/sh开头 - 它请求POSIX sh,而不是bash。不过,我会假设你真的想要bash。

#!/bin/bash
[[ -f "$1" ]] || { echo "Not a file" >&2; exit 1; }
exec <"$1"
total=0
while IFS=':' read -r _ _ _ groupid _; do
  (( total += groupid ))
done
echo "$total"

解释用于替换awk脚本组件的特定操作:read命令遍历行(默认情况下),按IFS中的字符拆分;所以IFS=: read -r _ _ _ groupid _丢弃前三列,将第四列放入名为groupid的变量中,并丢弃其余的列。 (( ))是bash中的数学上下文;在它内部,C风格的语法可用于整数算术运算,因此是加法。


顺便说一句,直接阅读/etc/passwd是一个坏主意 - 它不适用于使用LDAP,NIS或任何其他备用目录服务的系统。如果您使用的是Linux主机,则可以使用getent程序执行与当前目录服务无关的查找:

$ yourscript <(getent passwd)

所有这一切,这个问题的前提是一个糟糕的 - 虽然产生任何外部程序的开销,包括awk,一旦它运行awk比bash快得多。如果速度是你唯一的优先级,你最好不要使用shell,并让你的脚本以一个直接运行awk解释器的shebang开始。