在shell脚本中显示awk以显示/ etc / passwd信息

时间:2014-05-11 01:11:57

标签: linux bash awk redhat username

我试图在我的shell脚本中写一个awk行,它将搜索属于输入用户的passwd文件信息。由于awk只搜索特定的列以及第一列将根据使用的用户名而变化的事实,我想我必须在awk行中使用脚本输入$ username。

到目前为止,脚本中的行是:

awk -f awkpass.awk /etc/passwd

awkpass.awk文件中的行是:

/anyone/{print "Username\t\t\t" $1

我想我需要插入$ username而不是"任何人"因为$ username是我用来接收用户输入但不太确定的变量。非常感谢帮助。谢谢!

2 个答案:

答案 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 Mortoncomment正确指出的那样,这会导致脚本中反斜杠过多。我通常在脚本周围使用单引号(尽管在本答案的第一版中没有这样做)。

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)"