• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] for-Schleife und 2 Listen auswerten

admine

Ultimate Guru
Hallo Leute,

ich grübel grad an Folgendem:
Gegeben sind 2 Listen mit Namen, welche ich beide auswerten muss.
Versucht hab ich es mit der for-Schleife, aber irgendwie bin ich da wohl auf dem Holzweg :???:

Also das funzt:
Code:
#!/bin/bash
for i in `cat /home/admine/tmp/pl_passwd`; do
echo $i
done
und das auch (logisch):
Code:
#!/bin/bash
for k in `cat /home/admine/tmp/pl3_passwd`; do
echo $k
done
Aber als Ergebnis möchte ich in dem Script:
Code:
echo $i $k
Ich hab's mal so versucht, was aber nicht klappte :(
Code:
#!/bin/bash
for (( i in `cat /home/admine/tmp/pl_passwd`; k in `cat /home/admine/tmp/pl3_passwd` )); do
echo $i $k
done
Also beide Variablen, mit denen ich dann natürlich noch andere Sachsen anstellen muss und nicht nur "echo" ;)
(aber das ist ja erstmal nicht so interessant)

Kann man das überhaupt mit einer for-Schleife realisieren?
Wenn nicht, was für Möglichkeiten hab ich dann?

Schon mal vielen Dank für Hilfe.
Gruß admine
 

stka

Guru
vielleicht so:
Code:
#!/bin/bash
#erste Datei zum lesen öffnen
exec 3<dat1

#zweite Datei zum lesen öffnen
exec 4<dat2

for i in `cat dat1`
do
  read WERT1<&3
  read WERT2<&4
  echo "dat1 $WERT1 dat2 $WERT2"
done

# Dateien wieder schließen
exec 3<&-
exec 4<&-

die Dateien "dat1" und "dat2" haben dabei die selbe Anzahl an Zeilen.
 
Falls die Listen unterschiedliche Werte enthalten können, lohnt sich sort und anschliessend ein join.
Das Ergebnis ist eine neue Liste, bei denen die Werte mit gleichen Keys in einer Zeile stehen.
Über diesen Weg kann man auch riesige Listen ohne Performance Probleme verbinden.

Wenn die Liste unsortiert bleiben müssen, gleiche Keys aber verbunden werden müssen ist es etwas aufwendiger.
=> Zeilennummer anhängen
=> sort + join nach Key
=> join-Liste nachträglich nach der noch vorhandenen Zeilenummern sortieren.

Aber das passt wahrscheinlich nicht zu deinem Problem.

Haveaniceday
 
OP
A

admine

Ultimate Guru
stka schrieb:
die Dateien "dat1" und "dat2" haben dabei die selbe Anzahl an Zeilen.
Ja, das haben sie.
Und Wow ... das funzt super :)

Hintergrund ist, dass ich viele ... ganz viele Linux-User umbenennen muss und 2 Listen dazu habe.
Einmal die momentanen Namen aus der passwd:
Code:
awk -F: '{print $1}' /etc/passwd
Und mit sed habe ich die 2. Liste mit den neuen Login-Namen erstellt.

Damit will ich dann die User umbenennen:
Code:
#!/bin/bash
#erste Datei zum lesen öffnen
exec 3</home/admine/tmp/pl_passwd

#zweite Datei zum lesen öffnen
exec 4</home/admine/tmp/pl3_passwd

for i in `cat /home/admine/tmp/pl_passwd`
do
  read WERT1<&3
  read WERT2<&4
  usermod -l $WERT2 -d /home/$WERT2 -m $WERT1
done

# Dateien wieder schließen
exec 3<&-
exec 4<&-
Das schaut so aus, als ob es funktionieren könnte :)
Allerdings muss ich mir noch genauer ansehen, was da eigentlich passiert :roll:

Vielen Dank !!!
 
/etc/shadow nicht vergessen...
die sed-Befehle könnten vielleicht direkt im vipw in etc/passwd mit :%s.... funktionieren.

Haveaniceday
 
OP
A

admine

Ultimate Guru
haveaniceday schrieb:
/etc/shadow nicht vergessen...
Die sollte doch von "usermod" mit behandelt werden ... oder? :???:

haveaniceday schrieb:
die sed-Befehle könnten vielleicht direkt im vipw in etc/passwd mit :%s.... funktionieren.
Sorry, aber wie meinst du das?
Meine sed-Befehle sahen einfach so aus:
Code:
sed -i -e "s/01/3/" "/home/admine/tmp/pl3_passwd"
Wobei sich die Ersetzungen nur teilweise anwenden lassen ... manche neuen User-Namen muss ich einfach tippen und somit manuell die Liste erstellen.

Bevor ich das alles wirklich anwende, werde ich es natürlich noch an einem Test-System testen ;)
 
Als Beispiel:
cp /etc/passwd mywd<enter>
vi mywd<enter>
:%s/01/3/<enter>
:wq<enter>

_Aber_ in jeder Zeile wird das erste 01 in 3 umgeändert. Das kann zu Problemen führen. Bei Usern ohne 01
im Namen, dafür aber bei den hinteren Setting.
Im vi geht im "ed" Modus auch das s/von/nach/ (alias <befehlimedmodus>) und mit :<befehlimedmodus>
Ich bin davon ausgegangen, dass Du nur die Namen in /etc/passwd, /etc/shadow und /etc/group ändern willst.
Ohne usermod. Hmm, usermod sollte man aber nehmen, um die Home-Directories bei Bedarf mit umzubenennen.

Haveaniceday
 
OP
A

admine

Ultimate Guru
haveaniceday schrieb:
Hmm, usermod sollte man aber nehmen, um die Home-Directories bei Bedarf mit umzubenennen.
Und genau das will/muss ich machen. Daher auch "usermod".

Bei der Änderung der Login-Namen war das Ändern von 01 auf 3 nur ein Beispiel ... da gibt es noch viele andere Möglichkeiten, die mich, wie ich ja auch schon schrieb, teilweise einfach zum abtippen brachten.

Aber ich danke euch Beiden vielmals ... so komme ich doch schon ein ganzes Stück besser vorran.

Nun muss ich nur mal schaun, wie ich die alten User aus bzw. die neuen User in die smbpasswd bekomme.

Aber da denke ich auch so was mit 'ner for-Schleife und "smbpasswd -x $i" bzw. "smbpasswd -a $k".

Gruß admine
 
OP
A

admine

Ultimate Guru
Also nochmals vielen vielen Dank.
Mit deiner Idee, Stefan, hat es super geklappt und ich habe den ersten Teil der User-Migration ohne Probleme über die Bühne bekommen :)

D A N K E !!

Gruß admine
 
Oben