Wie liste ich angemeldete Benutzer ohne Duplikate auf?

7

Der whoBefehl kann verwendet werden, um angemeldete Benutzer zu finden, druckt jedoch doppelte Werte, wenn mehrere Shells ausgeführt werden. Wie erhalte ich eine Liste der aktuell angemeldeten Benutzer ohne Duplikate?

Anony
quelle
Es sollten keine doppelten Werte gedruckt werden, es sei denn, Sie öffnen mehrere tty und melden sich an. who -qMöglicherweise suchen Sie jedoch nach einem System, auf dem mehrere Benutzer gleichzeitig gehostet werden, sind sich jedoch nicht sicher.
Videonauth
who -q druckt die Gesamtzahl und die Benutzer. Sollen wir sort | verwenden? uniq?
Anony

Antworten:

9

Wir können die Ausgabe von whoto awkweiterleiten, um nur die erste Zelle jedes Datensatzes (Zeile) zu drucken, und sie dann an den Befehl sortweiterleiten, der die Werte alphabetisch sortiert und nur die eindeutigen -uEinträge ausgibt :

who | awk '{print $1}' | sort -u

Oder wir können nur verwenden awkin dieser Art und Weise :

who | awk '!seen[$1]++ {print $1}'

Eine POSIX-kompatible Lösung von @dessert, bei cutder die Leerzeichen als Trennzeichen verwendet werden -d' 'und nur das erste Feld jedes Datensatzes gedruckt wird -f1:

who | cut -d' ' -f1 | sort -u

Dank @DavidFoerster gibt es hier eine viel kürzere Syntax, bei der die Informationen aller anderen Spalten nicht verloren gehen:

who | sort -u -k 1,1

Für die gleichen Zwecke könnten wir den Befehl wmit der Option -h(Header ignorieren) verwenden, zum Beispiel:

w -h | awk '!seen[$1]++ {print $1}'

Wir könnten auch den Befehl in usersKombination mit dem Befehl rs(Daten umformen) mit der Transponierungsoption verwenden -Tund dann noch einmal sort -u:

users | rs -T | sort -u

Wir könnten und who -qmit Transposition folgendermaßen verwenden - wobei der Befehl head -1nur die erste Zeile der Ausgabe des vorherigen Befehls zuschneidet:

who -q | head -1 | rs -T | sort -u

Siehe auch:

pa4080
quelle
1
@dessert: Die Ausgabe von wund whoist nicht alphabetisch sortiert, daher habe ich absichtlich sort -uin der ersten Lösung verwendet. Auch die Ausgabe von who -qsollte transponiert werden (wie im letzten Beispiel), sonst ist das Ergebnis nicht korrekt.
pa4080
1
Ich denke nicht, dass der Abschnitt zum Zeitvergleich nützlich ist. Wenn nicht Tausende von Benutzern angemeldet sind, ist die Startzeit für die Befehle weitaus länger als die Zeit, die zum Verarbeiten und Drucken der Ausgabe benötigt wird. Der Abschnitt fügt der Antwort nur Rauschen hinzu, ohne dass dies von Vorteil ist.
Muru
2
@muru, du hast recht. Ich habe den Zeitvergleichsabschnitt aus der Antwort entfernt.
pa4080