#!/bin/bash
# This tells you that the script must be run by root.
if [ "$(id -u)" != "0" ];
then
echo "This script must be run as root!" 1>&2
exit 1
fi
userexists=0
while [ $userexists -eq 0 ]
do
# This asks for the user's input for a username.
echo -n "Enter a username: "
read username
x="$username:x:"
# This if block checks if the username exists.
grep -i $x /etc/passwd > /dev/null
if [ $? -eq 0 ]
then
userexists=1
else
echo "That user does not exist!"
fi
done
# This is the heading for the information to be displayed
echo "Information for" $username
echo "--------------------------------------------------------------------"
awk -v varname="var" -f passwd.awk /etc/passwd
awk -f shadow.awk /etc/shadow
BEGIN { FS = ":" }
/"variable"/{print "Username\t\t\t" $1
print "Password\t\t\tSet in /etc/shadow"
print "User ID\t\t\t\t"$3
print "Group ID\t\t\t"$4
print "Full Name\t\t\t"$5
print "Home Directory\t\t\t"$6
print "Shell\t\t\t\t"$7
}
我需要使用从shell脚本获取的变量并将其放入awk脚本中以搜索特定用户的passwd文件并显示所述信息,但我不确定它是如何工作的。我不完全了解如何使用-v命令以及将其放在awk脚本中的位置。
答案 0 :(得分:1)
如果你需要做的就是将 shell 变量$username
传递给awk
作为 awk 变量varname
:
awk -v varname="$username" -f passwd.awk /etc/passwd
在awk
程序中,您可以参考varname
(不 $
),这将返回$username
所具有的相同值在 shell 上下文中。
由于/etc/passwd
为:
- 已分隔且用户名为第1个字段,因此您可以在此处专门针对用户名字段进行匹配:
awk -F: -v varname="$username" -f passwd.awk /etc/passwd
然后,在passwd.awk
内,您可以使用以下模式:
$1 == varname
答案 1 :(得分:0)
仅关于awk-part:你可以简单地在执行部分中使用变量。
示例:awk -v varname="var" -v user="David" '$1==user {print varname;}"'
答案 2 :(得分:0)
你的脚本几乎是正确的。将shell命令更改为:
awk -v username="$username" -f passwd.awk /etc/passwd
然后在awk
脚本中:
$1 == username { print "Username\t\t\t" $1
...
}
使用$1 == username
优于$1 ~ username
,因为它更准确。例如,如果username=john
,并且/etc/passwd
中有其他类似的用户名,例如johnson
,johnny
,eltonjohn
,则它们都会匹配。使用$1 == username
将是严格匹配。
另外,这不太好:
grep -i $x /etc/passwd
-i
标志使其不区分大小写,但UNIX中的用户名区分大小写(john
和John
不一样)。只需删除-i
标记即可。
最后,脚本的第一部分可以更简洁,更清晰:
#!/bin/bash
# This tells you that the script must be run by root.
if [ $(id -u) != 0 ]; then
echo "This script must be run as root!" >&2
exit 1
fi
while :; do
# This asks for the user's input for a username.
echo -n "Enter a username: "
read username
# This if block checks if the username exists.
if grep ^$username:x: /etc/passwd > /dev/null; then
break
else
echo "That user does not exist!"
fi
done
基本上我删除了不必要的元素,引用和简化的表达式,并使grep
更加严格,并稍微清理了格式。