Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 用于显示/etc/passwd信息的Awk内部Shell脚本_Linux_Bash_Awk_Redhat - Fatal编程技术网

Linux 用于显示/etc/passwd信息的Awk内部Shell脚本

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是我用来接

我试图在我的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: "\$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
上所做的其他回答的随意研究也会表明,我并不经常在脚本周围使用双引号