`awk -F':' '$2 ~ "\$" {print $1}' /etc/shadow` 的解释是什么?

`awk -F':' '$2 ~ "\$" {print $1}' /etc/shadow` 的解释是什么?

我正在使用该命令来获取登录到我的机器的用户列表,但我不明白该命令的含义。

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 

相关内容