Anzeige:
Ergebnis 1 bis 9 von 9

Thema: awk - Dinge in einer Datei ersetzen

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.07.2003
    Beiträge
    87

    awk - Dinge in einer Datei ersetzen

    Hi Leute,

    ich möchte unter Linux in der Datei /etc/fstab den String /dev/hda oder /dev/hde durch /dev/cdrom ersetzen. Das funktioniert bereits:
    Code:
    $ cat /etc/fstab
    # /etc/fstab: static file system information.
    #
    # <file system> <mount point>   <type>  <options>       <dump>  <pass>
    proc            /proc           proc    defaults        0       0
    /dev/hda1       /               ext3    errors=remount-ro 0       1
    /dev/hda3       /home           ext3    defaults        0       0
    /dev/hda2       none            swap    sw              0       0
    /dev/hde        /media/cdrom0   udf,iso9660 user,noauto     0       0
    
    $ awk  '/cdrom/ {  $3 = "cdrom\t" ; print  } !/cdrom/ { print} '   FS='/' OFS='/'  /etc/fstab 
    # /etc/fstab: static file system information.
    #
    # <file system> <mount point>   <type>  <options>       <dump>  <pass>
    proc            /proc           proc    defaults        0       0
    /dev/hda1       /               ext3    errors=remount-ro 0       1
    /dev/hda3       /home           ext3    defaults        0       0
    /dev/hda2       none            swap    sw              0       0
    /dev/cdrom	/media/cdrom0   udf,iso9660 user,noauto     0       0
    Nur wie kann die den Output direkt wieder in die fstab schreiben?
    Sowas wie < fstab > fstab leert mir die Datei. Auch ein echo fstab | awk ... > fstab bringt leider nicht das gewünschte Ergebnis.

    Ich suche also sowas wie das --infile von sed. Den Umweg über eine 2. Datei möchte ich gerne vermeiden...

  2. #2
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Blöde Frage: warum machst du es nicht einfach mit sed?
    Ein gebrechlich Wesen ist der X-Server.

  3. #3
    Registrierter Benutzer
    Registriert seit
    17.07.2003
    Beiträge
    87
    1.) weil ich awk mag und mich nicht vor etwas schwieriger anmutenden Problemen von dessen Einsatz abhalten lassen möchte
    2.) weil ich keine sed Lösung habe

    Ich habe oben /dev/hda oder /dev/hde geschrieben. Auf anderer Hardware kann das auch hdb - hdg sein. Die awk Lösung ist dafür flexibel genug ausgelegt.

    EDIT: Die sed Lösung:
    sed -i -re '/cdrom0/s#(/dev/)\w+#\1cdrom#' /etc/fstab


    Trotzdem suche ich noch nach einer Lösung, um mit awk eine Datei diretk verändern zu können.
    Geändert von ThorstenS (01-05-2008 um 09:48 Uhr)

  4. #4
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    und - wo liegt das problem ?
    mal davon abgehen das ich bei so einem eingriff 100% mit backups arbeiten würde
    Code:
    cat /etc/fstab | awk ........ > /etc/fstab
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  5. #5
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Zitat Zitat von undefined Beitrag anzeigen
    und - wo liegt das problem ?
    mal davon abgehen das ich bei so einem eingriff 100% mit backups arbeiten würde
    Code:
    cat /etc/fstab | awk ........ > /etc/fstab
    Da bekommst du aber nur eine leere Datei zurück.

    Code:
    [florian@leuchtturm1 tmp]$ cat lines
    Hallo
    Welt
    Zeile1
    Zeile2
    Zeile3
    Zeile4
    Zeile5
    [florian@leuchtturm1 tmp]$ cat lines|awk '{print $0}'>lines
    [florian@leuchtturm1 tmp]$ cat lines
    [florian@leuchtturm1 tmp]$
    Man kann aber die Dateiumleitung in das awk-Programm einbauen (oder hast du das gemeint undefined?), dann funktioniert das ganze:
    Code:
    [florian@leuchtturm1 tmp]$ cat test_file
    # /etc/fstab: static file system information.
    #
    # <file system> <mount point>   <type>  <options>       <dump>  <pass>
    proc            /proc           proc    defaults        0       0
    /dev/hda1       /               ext3    errors=remount-ro 0       1
    /dev/hda3       /home           ext3    defaults        0       0
    /dev/hda2       none            swap    sw              0       0
    /dev/hde        /media/cdrom0   udf,iso9660 user,noauto     0       0
    [florian@leuchtturm1 tmp]$ awk  '/cdrom/ {  $3 = "cdrom\t" ; print >"test_file" } !/cdrom/ { print >"test_file"} '   FS='/' OFS='/'  test_file
    [florian@leuchtturm1 tmp]$ cat test_file
    # /etc/fstab: static file system information.
    #
    # <file system> <mount point>   <type>  <options>       <dump>  <pass>
    proc            /proc           proc    defaults        0       0
    /dev/hda1       /               ext3    errors=remount-ro 0       1
    /dev/hda3       /home           ext3    defaults        0       0
    /dev/hda2       none            swap    sw              0       0
    /dev/cdrom      /media/cdrom0   udf,iso9660 user,noauto     0       0
    Gruß, Florian
    Ein gebrechlich Wesen ist der X-Server.

  6. #6
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Dann soll er halt ... 1>&2> schreiben ;-)
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  7. #7
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Im Zweifelsfall gibt es ja immernoch diesen Shell-Trick, mit dem man den Dateinamen weiterverwenden kann (genau genommen wird die Datei geöffnet, gelöscht und neu erstellt):
    Code:
    (rm datei && awk '{print $0}' > datei) < datei

  8. #8
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von undefined Beitrag anzeigen
    Dann soll er halt ... 1>&2> schreiben ;-)
    Was soll das bringen? Was willst Du mit STDERR (&2) da?

    Das grundsätzliche Problem solcher Inplace-Ersetzungen ist, dass man nie sicher sein kann, wieviel vom Inhalt einer zu lesenden Datei bereits im Speicher ist, bevor die Schreiboperationen tatsächlich auf der Platte landen und ob der Lese-Filedescriptor schon zu ist, wenn geschrieben wird. Es ist also bei allen vorgeschlagenen Lösungen (außer sed -i) reine Glückssache, ob die Datei anschließend leer, verstümmelt oder vollständig ist.

    Da spielen Timings zwischen Lesen, Pipen, Schreiben eine Rolle, programminterne Abläufe (z. B. in welcher Reihenfolge und wann werden Filedescriptoren geöffnet und wieder geschlossen), Größe von R/W-Puffern usw. - das kann man von außen überhaupt nicht steuern, weil da viele Faktoren reinspielen: Hardware, Betriebssystem, Anwendung, Rechnerauslastung, Dateigröße, ...

    Ich würde also die Finger lassen von allen Versuchen, in eine zum Lesen geöffnete Datei gleichzeitig wieder reinzuschreiben (es sei denn, ich mache das in einem Programm gezielt über seek und tell).

    Eine Variante, das "in Place" mit awk zu regeln (wobei ich keine Ahnung habe, warum Du Dich so gegen eine temp. Datei sträubst) ginge so (ungetestet):
    Code:
    awk  '/cdrom/ {  # Aendern
    $3 = "cdrom\t" ; 
    # in Array ablegen
    arr[NR] = $0; 
    } 
    !/cdrom/ { # in Array ablegen
    arr[NR] = $0; 
    }
    END { # jetzt alles ausgeben, hier ist das Einlesen beendet
    for (i in arr) print arr[i] >"/etc/fstab"; } '   FS='/' OFS='/' /etc/fstab
    Hier halte ich also den Dateiinhalt im Programm im Speicher und schreibe ihn erst dann weg, wenn ich alles gelesen habe. Geht natürlich nur bei Dateien mit überschauberer Größe.

    Ich persönlich bevorzuge für solche Sachen allerdings den Umweg über eine temp. Datei - schon allein deshalb, weil ich dann sicherstellen kann, dass nur dann die Originaldatei ersetzt wird, wenn das Bearbeiten geklappt hat:
    Code:
    TMP_FSTAB=`mktemp` || exit 1
    awk ' ... ' /etc/fstab >$TMP_FSTAB && mv $TMP_FSTAB /etc/fstab
    Jan

  9. #9
    Registrierter Benutzer
    Registriert seit
    17.07.2003
    Beiträge
    87
    Danke für eure Anworten und das Mitdenken, speziell dir Jan.
    Der Trick das im END Bereich unterzubringen ist genial wie auch logisch - gefällt mir gut.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •