什么是 aw | cut -d "" -f 1 - 用grep和sort应该怎么做?

-3 grep shell-script sort cut w

这是我想要破译的代码:

w | cut -d " " -f 1 - | grep -v USER | sort -u
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 7

w | cut -d " " -f 1 - | grep -v USER | sort -u
Run Code Online (Sandbox Code Playgroud)

w命令显示已登录的用户以及一些附加信息:

$ w
 12:59:25 up 50 days, 21:45,  4 users,  load average: 1.02, 1.03, 1.01
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
bill      pts/12   xxx.xxx.xxx.xxx  12:55    0.00s  0.03s  0.03s tmux
bill      pts/14   tmux(64415).%0   12:55    0.00s  0.05s  0.03s w
dave      pts/18   yyy.yyy.yyy.yyy  Wed09   23:52m  1:15   1:07  vim clear_snapshots.pl
dave      pts/2    yyy.yyy.yyy.yyy  Tue14   23:48m  3.65s  3.65s -bash
Run Code Online (Sandbox Code Playgroud)

cut -d " " -f 1 -命令提取 this 的第一个以空格分隔的列(-末尾的可以删除):

$ w | cut -d " " -f 1

USER
bill
bill
dave
dave
Run Code Online (Sandbox Code Playgroud)

grep -v USER删除所有包含字符串的行USER

$ w | cut -d " " -f 1 | grep -v USER

bill
bill
dave
dave
Run Code Online (Sandbox Code Playgroud)

sort -u 按字典顺序对其输入进行排序,并删除重复的行:

$ w | cut -d " " -f 1 | grep -v USER | sort -u

bill
dave
Run Code Online (Sandbox Code Playgroud)

我的猜测是它尝试将当前登录的用户的用户名作为排序列表列出。

一种更简单的方法是使用users命令。users将在一行中输出所有登录的用户,但您可以通过管道将其输出tr ' ' '\n'sort -u每行获取一个用户:

users | tr ' ' '\n' | sort -u
Run Code Online (Sandbox Code Playgroud)

这另外不取决于产生的格式ww输出第一行的时间可能是也可能不是管道输出的一部分,具体取决于当前时间是一位数还是两位数,具体取决于什么实现的w你使用)。