我被告知要写一个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 "。因此,我需要使用内置命令来实现这一点,如果有人对此进行解释,那将是很好的。
答案 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开始。