我试图在我的 shell 脚本中编写一个 awk 行,该行将搜索属于输入用户的密码文件信息。由于 awk 只在特定的列中搜索,而且第一列会根据使用的用户名而有所不同,我想我必须在 awk 行中使用脚本输入 $username 。
到目前为止,脚本中的行是:
awk -f awkpass.awk/etc/passwd
awkpass.awk 文件中的行是:
/anyone/{print "用户名\t\t\t"$1
我想我需要插入 $username 而不是“任何人”,因为 $username 是我用来接收用户输入但不太确定的变量。非常感谢帮助。谢谢!
您可能会使用其中任何一个:
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 变量 $username
设置了 awk
变量 username
。此变体可与文件一起使用:
awk -F: -v username="$username" -f awk.script /etc/passwd
awk.script
包含:
$1 == username { print "Username\t\t\t", $1 }