/etc/passwd auswerten: Leerzeichen zerschießen alles!

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
kuahmelcher
Beiträge: 34
Registriert: 08.04.2014 17:06:40

/etc/passwd auswerten: Leerzeichen zerschießen alles!

Beitrag von kuahmelcher » 30.08.2014 16:54:27

Guten TAg, liebe Experten.

Ich habe ein kleines nerviges Problem: Ich versuche gerade ein kleines Script zu schreiben, bei dem mir die UID, der Username, das Homedir und der Real-Name/Info angezeigt werden. Der Bediener soll durch Eingabe einer 4-stelligen Zahl einen Benutzer auswählen können. Momentan versuche ich es so:

Code: Alles auswählen

#!/bin/bash
for z in $(cat /etc/passwd)
        do
                nr=$(echo "$z" | cut -d':' -f3)
                user=$(echo "$z" | cut -d':' -f1)
                echo "$nr - $user"
        done
Problem: Wenn im Real-Name (fünfte Spalte) Leerzeichen vorliegen, dann werden die als Zeilenende interpretiert und zerhauen mir die ganze schöne Systematik 8O
ALle Versuche um die Leerzeichen vorher durch Unterstriche zu ersetzen schlugen fehl.

Wie kann ich das verhindern?

Danke und Gruß, kuahmelcher

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: /etc/passwd auswerten: Leerzeichen zerschießen alles!

Beitrag von Cae » 30.08.2014 17:10:08

Du willst

Code: Alles auswählen

while read line; do
	# irgendwas
done <datei
verwenden, um Leerzeichen beizubehalten. Momentan zerhackt das for l in list alles mit Whitespaces als Trenner, d.h. du muesstest mit so etwas wie

Code: Alles auswählen

tr ' \011' _
vorschalten, was dann Leerzeichen und Tabs (\011 in oktaler Schreibweise) ersetzt und die Daten kaputt macht, was keine Loesung ist.

Mit echo laeufst du allerdings wieder in andere Probleme, z.B. wenn dein String mit - anfaengt (oder -e oder -n, das ist abhaengig von der echo-Implementation). Daher willst du

Code: Alles auswählen

printf "%s\n" "$var"
zum sicheren Ausgeben von $var verwenden.

Aber eigentlich willst du getent(1) nehmen und etwas wie

Code: Alles auswählen

$ cat >get-uid-name
#!/bin/sh

getent passwd "$1" | awk -F: '{print($3" - "$1)}'
$ chmod +x get-uid-name
$ ./get-uid-name 0
0 - root
$ 
und hast damit auch gleich noch den Vorteil, dass dein Konstrukt in LDAP- und aehnlichen Umgebungen nicht kaputt geht (wo es keine lokale passwd(5) gibt).

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: /etc/passwd auswerten: Leerzeichen zerschießen alles!

Beitrag von linuxCowboy » 30.08.2014 17:14:38

zum Beispiel:

Code: Alles auswählen

perl -F: -anE 'printf "user: %-15s uid: %-7d home: %-30s name: %30s\n", $F[0], $F[2], $F[5], $F[4]' /etc/passwd
-der_linux_cowboy --- Besser werden! ... f*** w$$

Antworten