linux - awk inside shell脚本显示/etc/passwd信息

标签 linux bash awk redhat

<分区>

我试图在我的 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 }

关于linux - awk inside shell脚本显示/etc/passwd信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23587928/

相关文章:

android - Linux下使用 "execve"运行android模拟器进程,但 "avd"路径错误?

php - 记录从 start-stop-daemon 调用的 php 脚本的错误输出

bash - 由于docker中.sh文件的权限被拒绝,travis测试失败

linux - 过滤txt文件中的列

linux - 如何停止在 BASH 中写入日志文件?

linux - 如何在 AWS ec 虚拟机上使用 hadoop 1.0 配置高可用性

Python os.system() 输入文本到脚本

linux - 如何将一些行移动到文件的顶部?

bash - 在 bash 中按特定顺序打印文件内容

linux - 如何安装 anacron?