2016-12-03 2 views
1

Ich bin neu in der Welt der Bash Scripting. Ich versuche eine einfache Aufgabe zu erledigen. versuchen, alle angemeldeten Benutzer und den von ihnen verwendeten Prozess aufzulisten.Bash Scripting, Sammeln von Informationen in der Sammlung

Wenn ich $(who) tun, erhalte ich die folgenden:

user1 console Nov 19 21:08 
user1 ttys010 Nov 28 09:32 

ich meinen Skript zur Ausgabe etwas erwarten wie:

user1:console 
user1:ttys010 

Dafür versuche ich folgendes zu tun.

userlist=$(who) 
for users in $userlist 
do 
    echo $users 
done 

Der Ausgang war ich erwartete die $ Benutzer würde einen den folgenden Wert:

$users[0] : user1 console Nov 19 21:08 (so that I could use 'cut' command to get what I wanted) 

Statt den realen Wert für Benutzer $, wenn ich diesen Befehl auszuführen ist:

$users[0] = user1 
$users[1] = console 
$users[2] = Nov 

Ich wäre dankbar, wenn mir jemand zeigen könnte, wie ich es erreichen kann. Hier geht es nicht darum, die eingeloggten Benutzer zu erreichen, sondern mehr über das Arbeiten mit Eingängen und Schleifen.

Antwort

1

Die Syntax der for Schleife ist:

for NAME [ [in [WORDS ...] ] ; ] do COMMANDS; done 

wo WORDS sind $IFS -separated Saiten.

Der Ausdruck userlist=$(who) weist die Ausgabe des who Befehls userlist Variable zu. Wenn die Variable $userlist nicht in doppelte Anführungszeichen eingeschlossen ist, wird sie auf die durch die Zeichen $IFS getrennten Wörter (insbesondere Zeilenumbrüche und Leerzeichen) erweitert.

Somit iteriert die folgende Schleife alle Wörter innerhalb $userlist string (die Ausgabe von Befehl).

for word in $userlist; do echo "$word"; done 

Um die ersten beiden Felder der Ausgabe zu erfassen, können Sie AWK Tool wie folgt:

who | awk '{print $1 ":" $2}' 

Die Variablen $1 und $2 zur ersten beziehen und die zweiten Felder im Datensatz .

Die Datensätze sind durch die Zeichen getrennt, die in AWK RS (Datensatzseparator) built-in variable angegeben sind. RS entspricht standardmäßig einem einzelnen Zeilenvorschubzeichen.

In ähnlicher Weise gibt FS integrierte Variable die Feldtrennzeichen an. Sein Standardwert ist Platz.

+0

Dank Ruslan für die ausführliche Antwort und Erklärung. Dies hat mir einen Einblick gegeben, wie diese Dinge funktionieren. Ich bin neu in der Welt des Scripting, ich schätze das sehr. –

1

Verwendung read mit einer while loop:

userlist=$(who) 
while read user line other; do 
    echo "$user":"$line"; 
done <<< "$userlist" 

Für jede Zeile:

  • user und line auf die beiden ersten Saiten des who Befehl gesetzt werden (die other Variable ist für den Rest der Linie, hier nicht benutzt). Die Variablen werden mit einem : Delimiter zurückgegeben.

Oder mit cut:

who | tr -s ' ' | cut -d' ' -f1,2 --output-delimiter=$':' 
+0

Danke für die Antwort. Sehr klar in meinem Kopf jetzt, wie das funktioniert. –

Verwandte Themen