我正在使用该命令来获取登录到我的机器的用户列表,但我不明白该命令的含义。
awk -F':' '$2 ~ "\$" {print $1}' /etc/shadow
答案1
该命令不会输出登录到机器的用户列表;实际上该命令将解析/etc/shadow
,而它没有登录到机器的用户的概念。
该命令将输出为其帐户设置了密码的用户列表。
以下是命令分解(请注意,这是专门针对 MAWK 的,它是安装在 Ubuntu 上的 AWK 版本,其中指定括在 中的模式""
是正确的,并且需要与括在 中的模式相同的转义//
,如中所述man mawk
):
-F':'
:将字段分隔符(对应于 AWK 的内部FS
变量)设置为:
;这意味着每个记录(或在本例中为行)的字段将按字符进行拆分:
,并且诸如$1
、$2
、$3
、 ... 的引用将分别引用当前记录的第一个冒号分隔的字符串、当前记录的第二个冒号分隔的字符串、当前记录的第三个冒号分隔的字符串,...。$2 ~ "\$"
:这就是所谓的“模式”;它是每次处理记录时都会评估的条件。本例中的条件是:如果第二个字段与正则表达式匹配\$
(即如果第二个字段包含字符$
),则执行以下“操作”。{print $1}
:这就是所谓的“动作”;它是每次前一个条件评估为 TRUE 时执行的代码块。它会打印第一个字段。
答案2
它不显示登录到您机器的用户,而是显示已设置密码的用户帐户。请注意,如果您使用gawk
而不是mawk
,"\$"
则需要将其更正为/\$/
或"\\$"
。
-F:
:使用冒号作为分隔符$2 ~ /\$/
:第二个字段(密码)是否包含美元符号print $1
:然后打印第一个字段(用户名)
用户登录的事实并未存储在其中/etc/shadow
。
答案3
您的命令的含义已经解释得足够清楚了两次,但我想补充一下如何真正列出所有当前登录的用户:
有一个特殊的命令可以实现这一点,称为who
。
它打印已登录用户及其状态的列表。如果添加-a
,它还包括系统用户;添加-u
(包含在-a
)还会打印登录进程的 PID 和空闲状态。
我只是将它与-H
获取一些列标题的选项一起使用:
$ who -H
NAME LINE TIME COMMENT
myusername :0 2016-01-26 08:08 (:0)
myusername pts/0 2016-01-26 08:16 (:0)
请注意,您打开的每个终端也都会列出(LINE
列中的值为pts/?
)。
答案4
kos 已经解释了你发布的命令对谁有效,以及为什么它对查找登录用户没有用。我的回答旨在回答你问题的后半部分 - 你如何真正找到登录用户的列表?实际上有多种方法。
字节指挥官已经提到了who
。
skolodya@ubuntu:$ who
xieerqi :0 2016-01-26 10:52 (:0)
xieerqi pts/6 2016-01-26 10:52 (:0)
xieerqi pts/0 2016-01-26 10:55 (:0)
还有另一个命令w
,它将显示更详细的登录用户列表。如果您在服务器上工作,这将非常有用,您可以检查用户是否从正确的 IP 地址登录,他们的程序占用了多少 CPU 等。
skolodya@ubuntu:$ w
10:56:23 up 4 min, 3 users, load average: 0.49, 0.55, 0.26
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
xieerqi :0 :0 10:52 ?xdm? 1:51 0.33s init --user
xieerqi pts/6 :0 10:52 30.00s 0.01s 0.01s /bin/mksh
xieerqi pts/0 :0 10:55 0.00s 0.02s 0.00s w
另一方面,users
将仅输出用户名列表,每个登录一个,因此,如果我在 TTY 登录并有两个gnome-terminal
选项卡,它将显示我的 3 个用户名。
skolodya@ubuntu:$ users
xieerqi xieerqi xieerqi
还有一个last
命令,它显示扩展的登录列表(包括以前的登录)。对于当前登录的用户,它显示行。知道你可以像这样still logged in
过滤掉输出:last
skolodya@ubuntu:$ last | awk '/still/'
xieerqi pts/0 :0 Tue Jan 26 10:55 still logged in
xieerqi pts/6 :0 Tue Jan 26 10:52 still logged in
xieerqi :0 :0 Tue Jan 26 10:52 still logged in