Linux 用于显示/etc/passwd信息的Awk内部Shell脚本
我试图在我的shell脚本中写一行awk,它将搜索属于输入的用户的passwd文件信息。因为awk只在特定的列中搜索,而且第一列会根据用户名的不同而有所不同,所以我想我必须在awk行中使用脚本input$username 到目前为止,脚本中的行是:Linux 用于显示/etc/passwd信息的Awk内部Shell脚本,linux,bash,awk,redhat,Linux,Bash,Awk,Redhat,我试图在我的shell脚本中写一行awk,它将搜索属于输入的用户的passwd文件信息。因为awk只在特定的列中搜索,而且第一列会根据用户名的不同而有所不同,所以我想我必须在awk行中使用脚本input$username 到目前为止,脚本中的行是: awk-f awkpass.awk/etc/passwd awkpass.awk文件中的行是: /anyone/{print“Username\t\t\t”$1 我想我需要插入$username而不是“anyone”,因为$username是我用来接
awk-f awkpass.awk/etc/passwd
awkpass.awk文件中的行是:
/anyone/{print“Username\t\t\t”$1
我想我需要插入$username而不是“anyone”,因为$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
;不清楚这是否是其中之一
~
和=
符号之间的区别在于~
变量使用正则表达式进行匹配。当然,使用=
的版本追求简单的相等。使用匹配意味着您可以拥有用户名='^(root | daemon | bin | sys)$”
并且您可以在一次脚本调用中获得四个命名用户的条目。缺点是,如果您只指定root
,您可能会获得多个条目(例如,在我的Mac上,我同时列出root
和\cmvsroot
)
这些脚本使用双引号,以便可以从命令行将用户名嵌入脚本中。但是,正如his中正确指出的,这会导致脚本中出现过多反斜杠。我通常在脚本周围使用单引号(尽管在本答案的第一版中没有这样做)
这些引号序列很微妙;最好避免它们。您可以通过在命令行上使用-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 }
您可能可以使用以下任一选项:
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
;不清楚这是否是其中之一
~
和=
符号之间的区别在于~
变量使用正则表达式进行匹配。当然,使用=
的版本追求简单的相等。使用匹配意味着您可以拥有用户名='^(root | daemon | bin | sys)$”
并且您可以在一次脚本调用中获得四个命名用户的条目。缺点是,如果您只指定root
,您可能会获得多个条目(例如,在我的Mac上,我同时列出root
和\cmvsroot
)
这些脚本使用双引号,以便可以从命令行将用户名嵌入脚本中。但是,正如his中正确指出的,这会导致脚本中出现过多反斜杠。我通常在脚本周围使用单引号(尽管在本答案的第一版中没有这样做)
这些引号序列很微妙;最好避免它们。您可以通过在命令行上使用-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 }
或者,您可以使用
getent
:
printf "Username: \t\t\t%s\n" "$(getent passwd "$username" | cut -d: -f1)"
或者,您可以使用
getent
:
printf "Username: \t\t\t%s\n" "$(getent passwd "$username" | cut -d: -f1)"
如果您提供示例输入和所需输出,这些类型的问题最好能得到回答。不清楚您是否只想在
/etc/passwd
中输出与输入用户名匹配的整行,或者是否想解析属于用户的各个字段。此外,除了明显的语法错误(缺少}
)之外,/etc/passwd
是一个带分隔符的文件(:
)。请解释您是希望awk
接受用户输入,还是您的shell脚本已经接受了用户输入?如果您提供示例输入和所需输出,最好回答这些类型问题的可能重复。不清楚您是只想在/etc/passwd
中输出与输入用户名匹配的整行,还是想解析属于用户的各个字段。此外,除了明显的语法错误(缺少}
)之外,/etc/passwd
是一个带分隔符的文件(:
)。请解释您是否希望awk
接受用户输入,或者您的shell脚本已经在接受用户输入了吗?可能的重复请不要使用双引号来分隔awk脚本,因为它会造成引用和转义混乱,否则会使脚本复杂化。请参见“\$1==username{print\”username:\t\t\t\”,\$1}”
vs“$1==username{print”username:\t\t\t“,$1}”
,而不是脚本文件中对上面的命令行所建议的内容之间的差异。@EdMorton:是的……我已经更新了我的答案。谢谢你叫醒我。即使是对我在awk
上所做的其他回答的随意研究也会表明,我并不经常在脚本周围使用双引号