"sed" - Substitution

LeoLinux

Well-Known Member
Hallo,


ich habe hier folgenden Textausschnitt:

Code:
# when going to single-user mode.
console none                            unknown off secure
#
ttyv0   "/usr/libexec/getty Pc"         cons25  on  secure
# Virtual terminals
ttyv1   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv2   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv3   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv4   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv5   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv6   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv7   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv8   "/usr/local/bin/xdm -nodaemon"  xterm   off secure
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyu0   "/usr/libexec/getty std.9600"   dialup  off secure
ttyu1   "/usr/libexec/getty std.9600"   dialup  off secure

ich möchte nun "ttyv1" bis "ttyv7" von bisher "on" auf "off" setzen.


bisher habe ich es mit meinen Tests nur soweit gebracht ... :

Code:
sed -i '' -e 's/\(ttyv[1-7]*\).*/\1/' ./test ;


was mir aber leider absolut nicht das liefert was ich gerne hätte ... ;(
Ich poste hier, weil ich wirklich nicht mehr vorwärts komme ;(


Vielen Dank
 
Mit awk habe ich es nun geschafft:
Code:
< /etc/ttys awk '/^ttyv[1-7]/{$(NF-1)="off"}{print $0}' | cat - > /etc/ttys ;

Ich wäre dennoch sehr an der sed Variante interessiert. So weit habe ich es un mit sed geschafft, leider fehlt noch etwas ...:
Code:
sed -i '' -e '/^ttyv[1-7]/s/ on/ off/g' ./etc/ttys ;
 
Code:
sed -E 's/(ttyv[1-7].*)on/\1off/'

Ich würde da übrigens über eine temporäre Datei oder Variable gehen, statt aus der gleichen Datei zu lesen und zu schreiben.
 
Ich verstehe, aber es funktioniert perfekt?! Ist ja nicht so, dass wir damit in ne Endlosschleife kommen ...
 
Es passt nur, weil cat puffert. Wenn du cat weglassen würdest, oder wenn cat weniger puffert müsste hinten etwas fehlen. Schließlich heißt > löschen und neu schreiben, das möglicherweise bevor man mit dem Lesen fertig ist.

Wie viele Zeilen hat denn deine /etc/ttys noch?
 
Der Datei fhlt nichts .. ich habe mir davor extra ein backup angelegt ...


Code:
server [~]# diff --ignore-file-name-case --to-file=/etc/ttys_ORIG /etc/ttys
35,41c35,41
< ttyv1	"/usr/libexec/getty Pc"		cons25	off  secure
< ttyv2	"/usr/libexec/getty Pc"		cons25	off  secure
< ttyv3	"/usr/libexec/getty Pc"		cons25	off  secure
< ttyv4	"/usr/libexec/getty Pc"		cons25	off  secure
< ttyv5	"/usr/libexec/getty Pc"		cons25	off  secure
< ttyv6	"/usr/libexec/getty Pc"		cons25	off  secure
< ttyv7	"/usr/libexec/getty Pc"		cons25	off  secure
---
> ttyv1	"/usr/libexec/getty Pc"		cons25	on  secure
> ttyv2	"/usr/libexec/getty Pc"		cons25	on  secure
> ttyv3	"/usr/libexec/getty Pc"		cons25	on  secure
> ttyv4	"/usr/libexec/getty Pc"		cons25	on  secure
> ttyv5	"/usr/libexec/getty Pc"		cons25	on  secure
> ttyv6	"/usr/libexec/getty Pc"		cons25	on  secure
> ttyv7	"/usr/libexec/getty Pc"		cons25	on  secure
server [~]#
 
Der Datei fhlt nichts .. ich habe mir davor extra ein backup angelegt ...

Das ist reines Glueck. Wenn das awk(1) in Deinem Kommando etwas laenger zum lesen von stdin braucht, als die Shell fuer das oeffnen Ausgabe fuer cat(1) (apropos: cat - ist Quark), dann hast Du anschliessend eine leere Datei. Extrembeispiel:

Code:
cd /tmp && cp /etc/ttys . && (sleep 1; cat) < ttys | cat > ttys && ls -l ttys
 
Für sed gibt es übrigens den Parameter -i, der genau für solche Dinge gedacht ist.
 
Auf der Shell ist eh nichts portabel.

Alleine schon weil POSIX so weite Spielräume lässt. Ein Skript, dass ich unter FreeBSD gerne verwende wurde auf dem AIX-Server meiner Hochschule zur Forkbombe.

Ich weiß gar nicht mehr, wie ich das wieder gestoppt hatte, denn ich hatte nicht die Zugriffsrechte ein killall abzusetzen (nicht mal auf meine eigenen Prozesse, autsch). Ich hatte jedenfalls Glück, dass da niemand mitbekommen hat, dass ich den Server für 'ne Minute lahmgelegt habe.
 
Auf der Shell ist eh nichts portabel.

Es ist nicht einfach, aber es ist nicht gaenzlich unmoeglich.

Alleine schon weil POSIX so weite Spielräume lässt.

Man muss ja nicht unbedingt Optionen verwenden, die explizit nicht portable sind, und auf die man gut verzichten kann (wie -i bei sed(1)). Sowas ist mit einer der Haupt-Nerv-Faktoren beim Schreiben von Ports bzw. beim damit fast immer verbundenen Reparieren kaputter autoconf-Tests.

Ein Skript, dass ich unter FreeBSD gerne verwende wurde auf dem AIX-Server meiner Hochschule zur Forkbombe.

Ich weiß gar nicht mehr, wie ich das wieder gestoppt hatte, denn ich hatte nicht die Zugriffsrechte ein killall abzusetzen (nicht mal auf meine eigenen Prozesse, autsch). Ich hatte jedenfalls Glück, dass da niemand mitbekommen hat, dass ich den Server für 'ne Minute lahmgelegt habe.

Da wuerde mich mal interessieren, wie Du versehentlich eine Forkbombe hinbekommen hast. Ich kenne aus dem SysV-Umfeld (Solaris, AIX etc.) eigentlich nur die unsaegliche Situation, dass es keine sinnvolle Reihenfolge von /bin, /usr/bin/, /usr/xpg4 und /usr/ucb gibt, mit der man seinen PATH weitgehend portable zurechtzimmern kann. Aber eine versehentliche Forkbombe? Da muesste dann ja auf Shell-Ebene schon was schiefgegangen sein.
 
Zurück
Oben