substitution unter sed

T

tco

sysinstall/noob
ich verusche gerade mit sed die passwd zu bearbeiten um die gid und uid zu ändern. weil sie nicht immer gleich ist will ich erstmal den relevanten user herausgrepen. folgendes script will aber nicht so wie ich will:

Code:
sed 's!$(cat passwd | grep user)!user:x:uid:gid:der user:/opt/user:/bin/bash!g'< passwd > passwdnew
auch ein
Code:
sed 's!${cat passwd | grep user}!user:x:uid:gid:der user:/opt/user:/bin/bash!g'< passwd > passwdnew
macht kein unterschied. wie kann ich also unter sed richtig substituieren?

danke schonmal
 
Hi,

prinzipiell ist die genaue Fehlermeldung immer hilfreich. Ich habe mir den Ausdruck jetzt nicht genau angeguckt, aber wenn ich das richtig sehe, versuchst du das Ausrufezeichen als Trennzeichen fuer sed zu benutzen. In der bash wird das nicht funktionieren, weil das Ausrufezeichen eine Sonderbedeutung hat.
Auch das 'cat' ist unnoetig, grep kann direkt aus Dateien lesen.

mfg,
bytepool
 
Zuletzt bearbeitet:
Hallo,

wenn du single quotes (') verwendest, werden die Variablen und Kommandos (${} bzw. $()) innerhalb davon nicht ausgewertet, sondern gehen unverändert an den sed weiter, und Zeilen, wie die, nach denen du damit also suchst, gibt es in der passwd wohl eher selten.

(NB: innerhalb von single quotes hat auch '!' keine Sonderbedeutung, ansonsten ist bytepools Einwand aber voll berechtigt; ich bevorzuge in so einem Fall meistens '|'.)

Und schliesslich: warum die passwd-Datei zweimal lesen (grep und sed), wenn das Ganze auch in einem Durchgang zu erledigen ist: du suchst einfach nach Zeilen, die mit dem gewünschten Login-Namen anfangen, und ersetzt darin Feld 3 und 4, etwa so:

Code:
LOGIN=user
USERID=1000
GROUPID=1000

sed -e "s|^$LOGIN:x:[0-9]*:[0-9]*:\(.*\)|$LOGIN:x:$USERID:$GROUPID:\1|" <passwd >passwd

Nochmal NB: anstatt die /etc/passwd allerdings mit sed zu verwursteln, würde ich das Ganze eher mit "usermod -u ... -g ... " bearbeiten ... ;-)

Gruss
 
Hi,
(NB: innerhalb von single quotes hat auch '!' keine Sonderbedeutung, ansonsten ist bytepools Einwand aber voll berechtigt; ich bevorzuge in so einem Fall meistens '|'.)
mhh, verrueckt, ich koennte schwoeren dass ich das vor ein paar Monaten noch getestet habe (sed mit ! als Trennzeichen), und es nicht funktionierte. Aber du hast Recht, hab's grad nochmal getestet, funktioniert wunderbar solange man mit single quotes arbeitet. I stand corrected once again...

mfg,
bytepool
 
danke für die antworten.
eine fehlermeldung hab ich nie bekommen. obwohl ich sogar -x übergeben habe. ich schätze dass sed schon richtig gearbeitet hat, aber die substitution einfach nicht gemacht hat. also hat er nach dem falschen gesucht, nichts gefunden und auch nichts ausgetauscht. so wie floyd62 schon richtig vermutet.

da ich das für mehrere systeme machen muss und die UID und GID nicht immer gleich vegeben worden ist, dachte ich mir, ich machs mir leicht durch direktes bearbeiten der passwd und group.

edit:
ich hab das ganze jetzt folgendermassen gelöst:
array=( $(grep batman /etc/passwd | awk -F: '{print $3,$4}') );
usermod -u newU -g newG -s /bin/bash -m -d /opt/batman batman;
groupmod -g newG batman &&
chown --from=${array[0]}.${array[1]} newU.newG -R /
 
Zuletzt bearbeitet:

Ähnliche Themen

Switche abfragen über Script

sed in awk

Samba 3.6.25 - OpenLDAP Setup

Skript soll nicht doppelt laufen... kill pkill pid cron

Zugriff Ubuntu 16.04. auf Freigabe 18.04. LTS nicht möglich

Zurück
Oben