我试图在我的shell脚本中写一个awk行,它将搜索属于输入用户的passwd文件信息。由于awk只搜索特定的列以及第一列将根据使用的用户名而变化的事实,我想我必须在awk行中使用脚本输入$ username。
到目前为止,脚本中的行是:
awk -f awkpass.awk /etc/passwd
awkpass.awk文件中的行是:
/anyone/{print "Username\t\t\t" $1
我想我需要插入$ username而不是"任何人"因为$ username是我用来接收用户输入但不太确定的变量。非常感谢帮助。谢谢!
答案 0 :(得分:3)
你可以使用以下任何一种:
awk -F: "\$1 ~ /$username/ { print \"Username:\t\t\t\", \$1}"
awk -F: "\$1 == \"$username\" { print \"Username:\t\t\t\", \$1}"
其中$1
之前的反斜杠保护$
免受shell的攻击,双引号之前的反斜杠保护它们不受shell影响。有时值得使用-f awk.script
;目前尚不清楚这是否是其中之一。
~
和==
表示法之间的区别在于~
变体使用正则表达式匹配。当然,使用==
的版本用于简单相等。使用匹配意味着您可以拥有username='^(root|daemon|bin|sys)$'
,并且您只需在脚本的单个调用中获取四个命名用户的条目。缺点是,如果仅指定root
,则可能会有多个条目(例如,在我的Mac上,我同时列出了root
和_cmvsroot
。
这些脚本使用双引号,以便可以从命令行将用户名嵌入到脚本中。但是,正如Ed Morton中comment正确指出的那样,这会导致脚本中反斜杠过多。我通常在脚本周围使用单引号(尽管在本答案的第一版中没有这样做)。
awk -F: '$1 ~ /'"$username"'/ { print "Username:\t\t\t", $1}'
awk -F: '$1 == "'"$username"'" { print "Username:\t\t\t", $1}'
那些引用序列很微妙;最好避免它们。您可以通过使用-v varname="value"
表示法在命令行上指定变量的初始值来实现此目的。因此,您也可以使用:
awk -F: -v username="$username" \
"\$1 == username { print \"Username:\t\t\t\", \$1}" /etc/passwd
或者更好,因为它在脚本周围使用单引号:
awk -F: -v username="$username" \
'$1 == username { print "Username:\t\t\t", $1}' /etc/passwd
这会从shell变量awk
设置username
变量$username
。此变体可与文件一起使用:
awk -F: -v username="$username" -f awk.script /etc/passwd
awk.script
包含:
$1 == username { print "Username\t\t\t", $1 }
答案 1 :(得分:1)
或者,您可以使用getent
:
printf "Username: \t\t\t%s\n" "$(getent passwd "$username" | cut -d: -f1)"