Superuser

Autor Thema: nicht unten dran-haengen sondern oben drauf-kleben  (Gelesen 17530 mal)

Offline signal_15

  • Sobl Master
  • ****
  • Beiträge: 426
    • Rechenzentrum Amper
nicht unten dran-haengen sondern oben drauf-kleben
« am: 01. April 2009, 11:02:38 »
Hi,

bin auf der suche nach einer einfachen methode um eine zeile text in eine datei oben am anfang rein zu schreiben.
ein
  echo "bla blub" >> /irgendwo/datei
schreibt mir den inhalt an das ende der datei. ich moechte aber den bisherigen inhalt der datei um zeile nach unten verschieben und den inhalt oben drauf geben. hat da jemand eine idee?

ct,

sonnenblen.de - Das unabhängige Sun User Forum

nicht unten dran-haengen sondern oben drauf-kleben
« am: 01. April 2009, 11:02:38 »

Offline Octane_Suicide

  • Sobl Newbie
  • *
  • Beiträge: 42
Re: nicht unten dran-haengen sondern oben drauf-kleben
« Antwort #1 am: 01. April 2009, 12:25:03 »
Hallo,

vielleicht die Zeile in eine Datei schreiben und den umgekehrten Weg gehen?
Also das Ziel-File an das File mit der einen Zeile haengen und am Ende den Dateinamen aender...
Glaub das sollte gehen, oder?

MfG Michael

Offline signal_15

  • Sobl Master
  • ****
  • Beiträge: 426
    • Rechenzentrum Amper
Re: nicht unten dran-haengen sondern oben drauf-kleben
« Antwort #2 am: 01. April 2009, 15:52:20 »
habs nun folgendermasen gemacht:
echo "bla blup" >> $temp1
cat $datei >> $temp1
cat $temp1 > $datei

ein einzeiler waere mir aber trotzdem lieber gewesen. so muss cat zwei mal laufen und auf dauer, wenn die datei groesser wird, wird's immer langsamer.

ct,

Offline dominik

  • Sobl Bachelor
  • ***
  • Beiträge: 182
  • Me, myself & I
    • Meine Heimseite
Re: nicht unten dran-haengen sondern oben drauf-kleben
« Antwort #3 am: 01. April 2009, 16:17:47 »
ein einzeiler waere mir aber trotzdem lieber gewesen. so muss cat zwei mal laufen und auf dauer, wenn die datei groesser wird, wird's immer langsamer.

Geht doch:

echo "bla blup" >> $temp1; cat $datei >> $temp1; cat $temp1 > $datei

Gruss
Dominik

Offline signal_15

  • Sobl Master
  • ****
  • Beiträge: 426
    • Rechenzentrum Amper
Re: nicht unten dran-haengen sondern oben drauf-kleben
« Antwort #4 am: 01. April 2009, 16:38:29 »
@dominik
der war gut.-)

ct,

Offline dornroeschen

  • Sobl Junior
  • **
  • Beiträge: 64
Re: nicht unten dran-haengen sondern oben drauf-kleben
« Antwort #5 am: 01. April 2009, 16:44:18 »
Dem Editör is nix zu schwör  ;D
/usr/bin/echo '0a\nbla blub\n.\nw\nq' | ed -s $datei

Rainer

Offline signal_15

  • Sobl Master
  • ****
  • Beiträge: 426
    • Rechenzentrum Amper
Re: nicht unten dran-haengen sondern oben drauf-kleben
« Antwort #6 am: 01. April 2009, 16:48:41 »
@dornroeschen
na also, geht doch. sieht doch schon mal recht vielversprechend (oder heisst es 'viel versprechend') aus. ich glaub nicht, dass ich das script noch heute anpassen werde. aber ich gebe dann bescheid.

ct,

mdjr

  • Gast
Re: nicht unten dran-haengen sondern oben drauf-kleben
« Antwort #7 am: 02. April 2009, 07:41:29 »
Dem Editör is nix zu schwör  ;D
/usr/bin/echo '0a\nbla blub\n.\nw\nq' | ed -s $datei

Rainer

Hallo.

Das wird allerdings bei großen Dateien nicht funktionieren.

Das "unten dran-Hängen" ist eine Operation, die jedes Betriebssystem von sich aus unterstützt. Ein direktes "oben dran-Kleben" ist bei den mir bekannten Dateisystemen (FAT, NTFS, UFS, EXT2) wohl unmöglich.

Die Datei muss beim "oben dran-Kleben" also komplett neu geschrieben werden. Dazu gibt es zwei Möglichkeiten:
- Die zwei-Dateien-Lösung
- Die Datei komplett in den RAM lesen und dann schreiben (Lösung mit dem "ed"-Editor)

Da bei großen Dateien aber nicht genügend RAM zur Verfügung steht, ist das ein Problem.

habs nun folgendermasen gemacht:
echo "bla blup" >> $temp1
cat $datei >> $temp1
cat $temp1 > $datei

Mehr Performance würde der folgende Code bringen, da kein zweites Umkopieren notwendig ist:
echo "bla blup" > $temp1
cat $datei >> $temp1
rm $datei
mv $temp1 $datei
(Allerdings gehen dabei UID, GID, Mode, ... von "$datei" verloren)

Martin

Offline signal_15

  • Sobl Master
  • ****
  • Beiträge: 426
    • Rechenzentrum Amper
Re: nicht unten dran-haengen sondern oben drauf-kleben
« Antwort #8 am: 02. April 2009, 09:11:32 »
@Martin

richtig. und ich brauche/habe folgendes:
total 46K
drwxr--r--  2 root   other  512 Apr  1 16:35 .
drwxr-xr-x 14 root   other 1.0K Mar 31 14:02 ..
-rw-r--r--  1 daemon other 7.1K Apr  1 16:50 index.shtml
-rw-r--r--  1 root   other  12K Apr  1 14:22 index.shtml_Backup_2009_04_01
-rw-r--r--  1 daemon other 6.3K Apr  1 16:50 news-db
-rw-r--r--  1 root   other 1.2K Apr  1 14:37 test.shtml

man koennte das script als 'daemon' laufen lassen. aber dann muesste auch das verzeichnis dieser uid gehoeren, oder zumindest die schreib/lese-rechte geaendern werden. und das soll nicht sein.

ct,

Offline dornroeschen

  • Sobl Junior
  • **
  • Beiträge: 64
Re: nicht unten dran-haengen sondern oben drauf-kleben
« Antwort #9 am: 02. April 2009, 10:19:37 »
Dem Editör is nix zu schwör  ;D
/usr/bin/echo '0a\nbla blub\n.\nw\nq' | ed -s $datei

Rainer

Hallo.

Das wird allerdings bei großen Dateien nicht funktionieren.

Völlig richtig. Jede Lösung ist gut/nicht gut bzw geht/geht nicht nur im Rahmen der bekannten/nicht bekannten Randbedingungen. Ich finde den ed  als Skripting Tool für Inline-Editing ganz interessant, solange klar ist, dass die Begrenzungen des Tools nicht überschritten werden. Beim Solaris ed sind dies die maximale Zeilenlänge von 512 Zeichen, und die Begrenzung der Zeilen durch die Speichergröße. Wie die Beschränkungen des GNU-ed aussehen, weiss ich jetzt nicht.

Alternativ kann man identisch auch den ex (vi) einsetzen, oder die ex-Variante des vim. Ich glaube nicht, dass vim oder auch nvi eine Beschränkung der Zeilenlänge haben.

Rainer

sonnenblen.de - Das unabhängige Sun User Forum

Re: nicht unten dran-haengen sondern oben drauf-kleben
« Antwort #9 am: 02. April 2009, 10:19:37 »

llothar

  • Gast
Re: nicht unten dran-haengen sondern oben drauf-kleben
« Antwort #10 am: 02. April 2009, 11:28:36 »
Ja hier sehen wir wieder mal das Problem das Filesysteme vom Programmiertechnischen sich seit fast 30 Jahren nicht verändert haben. Eine Datei als Queue die vorne und hinten anfügen und entfernen unterstützt und das reinschiessen von Löchern (Sparse Files) ist eigentlich so sinnvoll.

Aber egal. Ich würde gerne wissen wozu du das brauchst. Denn ich denke du setzt falsch an. Vorne und hinten sind technisch irgendwie gleich. Wenn es wegen anzeige der Daten ist ändere die Datenanzeige.


Offline meik

  • Sobl Bachelor
  • ***
  • Beiträge: 187
Re: nicht unten dran-haengen sondern oben drauf-kleben
« Antwort #11 am: 02. April 2009, 12:51:08 »
habs nun folgendermasen gemacht:
echo "bla blup" >> $temp1
cat $datei >> $temp1
cat $temp1 > $datei

ein einzeiler waere mir aber trotzdem lieber gewesen. so muss cat zwei mal laufen und auf dauer, wenn die datei groesser wird, wird's immer langsamer.

Bei der Größenordnung würde ich mir um Performance keine Gedanken machen. Ein paar kB machen auf einem Rechner mit Gigabytes an RAM wirklich kein Problem.

Sollte das wirklich in messbare Regionen kommen, wirst du wahrscheinlich sowieso messen müssen, welche Variante die beste ist.

Was mir sonst noch eingefallen ist:

  • cat kommt auch mit mehreren Files als Parameter zurecht
  • eine Zeile einfügen geht auch mit sed statt ed
  • wenn es mehr als eine Zeile sein soll, können ed und sed auch ein ganzes File einfügen.
  • Einige sed Varianten (GNU z.B.) können mit -i auch die Datei in-place bearbeiten

Offline signal_15

  • Sobl Master
  • ****
  • Beiträge: 426
    • Rechenzentrum Amper
Re: nicht unten dran-haengen sondern oben drauf-kleben
« Antwort #12 am: 02. April 2009, 13:00:35 »
$llothar

ich habe ein shell skript als cgi auf einem apachen laufen, welches neue nachrichten aus einem webformular zuerst in eine plain-text datei schreibt und diese dann in eine html seite einfuegt.

#!/bin/sh
# create entry on the news page

umask=022
grep=/usr/bin/grep
awk=/usr/local/bin/awk
cat=/usr/local/bin/cat
temp1=/tmp/tmp.$$
temp2=/tmp/tmp.$$
mdate=`date "+%d %B %Y"`
mtime=`date "+%H:%M"`
newsdb=/var/www/news/news-db
newsindex=/var/www/news/index.shtml
newsheader=/var/www/news/news-header
newsfooter=/var/www/news/news-footer
eval `/usr/local/bin/proccgi.sh $*`

# build the news-db
echo "<tr><td>$mdate</td><td>$mtime</td><td></td><td><b>$FORM_ueberschrift</b></td></tr>" >> $temp1
echo "<tr><td>      </td><td>      </td><td></td><td>$FORM_nachricht <br><br></td></tr>" >> $temp1
$cat $newsdb >> $temp1
$cat $temp1 > $newsdb

# build the page
/usr/local/bin/cat $newsheader > $newsindex
/usr/local/bin/cat $newsdb >> $newsindex
/usr/local/bin/cat $newsfooter >> $newsindex

# clean up
rm -r $temp1

echo "Content-type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<body><p>yeah, check the news site</p></body></html>"
exit 0

ct,

Edith sagt: Name falsch geschrieben.

llothar

  • Gast
Re: nicht unten dran-haengen sondern oben drauf-kleben
« Antwort #13 am: 02. April 2009, 13:49:37 »
$llothar

ich habe ein shell skript als cgi auf einem apachen laufen, welches neue nachrichten aus einem webformular zuerst in eine plain-text datei schreibt und diese dann in eine html seite einfuegt.

So was hab ich mir gedacht. Da du die Datei ja sowieso komplett liest häng es unten dran und mach ein "reverse" und beim dranhängen dann natürlich auch noch ein reverse. Man kann mittels tail -n auch die letzten zeilen ausgeben.

Vorne dran hängen würde ich nichts. Umkopieren ist viel aufwendiger als lesen und umdrehen.

Offline signal_15

  • Sobl Master
  • ****
  • Beiträge: 426
    • Rechenzentrum Amper
Re: nicht unten dran-haengen sondern oben drauf-kleben
« Antwort #14 am: 02. April 2009, 13:51:51 »
@llothar
jetzt habe ich deinen faden verloren. wie meinen?

ct,