Textzeile oben in eine bestehende Textdatei einfügen

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Textzeile oben in eine bestehende Textdatei einfügen

Beitrag von Richard » 05.04.2018 11:55:20

Hallo,

ich habe ein Skript erstellt welches zunächst im Home-Verzeichnis nach Textdateien sucht und dann den Inhalt in eine andere Textdatei sammelt. Es wird immer nur die 1. Zeile gefüllt und kopiert.

Code: Alles auswählen

var=$(find /home/richard/ -name "*.log")
awk 1 $var >> /home/richard/zusammen.log
awk muss ich hier verwenden, da sonst immer die 1. Zeile und eine Leerzeile kopiert wurde. Ich habe nicht herausbekommen wie das mit cat zu machen geht. Hier wird aber der Text immer unten angehängt. Ich würde gerne den letzten Text oben haben. Grds. geht das so

Code: Alles auswählen

sed -i '1s/.*$/Neuer Text\n\&&/g' Inputfile
oder auch mit einer Variable statt dem Text

Code: Alles auswählen

sed -i '1s/.*$/'$log'\n\&&/g' Inputfile
Leider bekomme ich diese beiden Sachen nicht zusammen. Ich habe es so versucht:

Code: Alles auswählen

var=$(find /home/richard/ -name "*.log")
log=$(awk 1 $var)
sed -i '1s/.*$/'$log'\n\&&/g' Inputfile
springt der Cursor nur eine die nächste Zeile so als ob er auf Eingaben wartet.

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Textzeile oben in eine bestehende Textdatei einfügen

Beitrag von tobo » 05.04.2018 12:12:34

Ist das was?

Code: Alles auswählen

find /home/richard/ -type f -name "*.log" -exec sed -n 1p {} \; >> /home/richard/zusammen.log

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Textzeile oben in eine bestehende Textdatei einfügen

Beitrag von Meillo » 05.04.2018 12:43:24

Am Ende anhaengen ist natuerlich als am Anfang. Darum waere es sinnvoller, die Dateien einfach andersrum abzuarbeiten, dann kannst du naemlich am Ende anhaengen. Allerdings verwendest du find(1), wodurch die Reihenfolge undefiniert ist. Das macht fuer mich noch keinen rechten Sinn.


Ich wuerde in etwa so herangehen:

Code: Alles auswählen

find /home/richard/ -type f -name "*.log" | sort -r | xargs -d \\n cat > /home/richard/zusammen.log
Das `sort -r' wuerde die Dateinamen, die vermutlich datumsbasiert sind verkehrt rum ordnet.

Wenn du nicht die Dateien andersrum haben willst, sondern die Inhalte verkehrt rum, dann so:

Code: Alles auswählen

find /home/richard/ -type f -name "*.log" | xargs -d \\n cat | tac > /home/richard/zusammen.log

Was du mit der ``ersten Zeile'' meinst, verstehe ich noch nicht. `awk 1 datei' gibt die ganze Datei aus, weil `1' true ist und die Default-Aktion `print' ist. Wenn du nur die erste Zeile ausgeben willst, dann mit `head -n 1' oder `sed q' oder mit `awk "NR==1"'.
Use ed once in a while!

uname
Beiträge: 12046
Registriert: 03.06.2008 09:33:02

Re: Textzeile oben in eine bestehende Textdatei einfügen

Beitrag von uname » 05.04.2018 12:47:36

Mal eine Alternative mit head:

Code: Alles auswählen

find . -type f -name "*.txt" |xargs head -qn1
Mit Dateiangabe für Debug:

Code: Alles auswählen

find . -type f -name "*.txt" |xargs head -n1
Meilo hat geschrieben:Wenn du nicht die Dateien andersrum haben willst, sondern die Inhalte verkehrt rum, dann so:
... | tac | ...
Du kannst auch alles von links auf rechts drehen, wodurch die Lesbarkeit jedoch nicht erhöht wird ;-)

Code: Alles auswählen

... | rev | ... 

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Textzeile oben in eine bestehende Textdatei einfügen

Beitrag von rendegast » 05.04.2018 13:23:20

Textzeile oben in eine bestehende Textdatei einfügen
Vielleicht

Code: Alles auswählen

TMPf=$(tempfile)
echo "zeile" > $TMPf
cat datei >> $TMPf
cat $TMPf > datei
Das Kopieren scheint mir gegenüber awk/sed akzeptabel, da auch awk/sed implizit kopieren.
Vergleiche die inode der Zieldatei vor und nach 'sed -i ...' ('ls -1i ...').

Vielleicht auch sowas

Code: Alles auswählen

echo "zeile" >> datei
tac datei > ansicht
EDIT Ups, 'tac' war schon erwähnt.








awk 1 $var

Code: Alles auswählen

awk 1 datei
/usr/bin/mawk 1 datei
/usr/bin/gawk 1 datei
geben bei mir die ganze Datei, nicht nur die erste Zeile aus.





find /home/richard/ -name "*.log"
sowas ist bei mir immer in gewissem Maße unsortiert, entsprechend mache ich sowas

Code: Alles auswählen

find /home/richard/ -name "*.log" | sort ....
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Textzeile oben in eine bestehende Textdatei einfügen

Beitrag von Richard » 05.04.2018 16:12:11

Das ganze soll bei uns auf Arbeit laufen. Da werden Logfiles ausgegeben, die ich in eine Textdatei "umspeichere". Jede Logfile hat genau 1 Zeile (daher 'awk 1'; cat hat hier die eine Zeile und eine Leerzeile kopiert). Die Datei soll immer weiter ergänzt werden, daher kommen immer wieder neuen Zeilen hinzu. Das ist kein Vorgang der einmal abläuft und fertig. Das Programm, dass diese Logfiles erstellt wurde von einem ehemaligen Mitarbeiter geschrieben und ist (vermutlich) ein Unicat :hail:

Ich will auch mein bisheriges Vorgehen nicht zu stark ändern, dass sich das bewährt hat und eine Datei erzeugt wie sie sein soll.
tobo hat geschrieben: ↑ zum Beitrag ↑
05.04.2018 12:12:34
Ist das was?

Code: Alles auswählen

find /home/richard/ -type f -name "*.log" -exec sed -n 1p {} \; >> /home/richard/zusammen.log
Fügt die Textzeile dennoch unten an.

@ Meillo

Dein Vorschlag geht davon aus, dass die Dateien einmalig vorliegen. Sie werden aber immer wieder erstellt und sollen immer wieder ergänzt werden. Das hätte ich vielleicht mit schreiben sollen.
Was du mit der ``ersten Zeile'' meinst, verstehe ich noch nicht. `awk 1 datei' gibt die ganze Datei aus, weil `1' true ist und die Default-Aktion `print' ist.
Bei mir war es so, dass wenn ich mit cat kopiert habe eine Leerzeile mit kopiert wurde, bei awk nicht. Daher awk. Es ging mir auch darum erstmal ein funktionierendes Skript zu haben.
Mal eine Alternative mit head
Irgendeinen Pferdefuß hatte ich head - ich hab aber vergessen welcher. :? Hab da zu viele Varianten durchprobiert.

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Textzeile oben in eine bestehende Textdatei einfügen

Beitrag von tobo » 05.04.2018 16:14:08

Vielleicht dann sowas:

Code: Alles auswählen

f=zusammen.log;cd ~ && touch $f && cat <(find . -name $f -prune -o -type f -name '*.log' -exec sed q {} \;) $f > tmp.txt && mv tmp.txt $f
Wobei die Reihenfolge innerhalb eines find-Durchlaufs noch immer unklar ist. tac nach dem Befüllen einer bereits existierenden Datei liefert logisch etwas anderes. Bei sed i\ müsste man die Eingabe editieren.

EDIT: Wenn da nur eine Zeile jeweils drinsteht, dann könnte man sich das sed auch noch sparen.

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Textzeile oben in eine bestehende Textdatei einfügen

Beitrag von Richard » 05.04.2018 16:44:37

@ tobo

Bin mir grad unsicher was genau hier passieren soll.

Es wird eien Variable f festgelegt mit dem Inhalt 'zusammen.log', nach $HOME gewechselt, dort eine leere Datei mit Namen 'zusammen.log' angelegt. Hier wird doch die existierende überschrieben?
Dann wird nach dieser Datei gesucht, die ja aber schon überschrieben und daher leer ist. Die schon vorhandenen Daten sind ja denn weg.

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Textzeile oben in eine bestehende Textdatei einfügen

Beitrag von tobo » 05.04.2018 16:58:17

Der Dateiname wird festgelegt (besser noch FN= und besser auch noch die ganze Zeile mit (...) einschließen), weil desöfteren verwendet und deshalb kürzer/fehlerunanfälliger/editierbarer in der Schreibweise. touch legt diese Datei an, wenn sie nicht existiert. Existiert sie aber bereits, dann wird nur der Zeitstempel dieser Datei gesetzt. Der Dateiinhalt bleibt unverändert. touch schadet nicht und war nur Sicherung gedacht, falls dort keine Datei vorhanden ist. Anschließend wird eben diese Datei bei der Suche ausgeschlossen (hat ja ebenfalls Dateiendung .log), damit nicht auch von dieser Datei die 1. Zeile kopiert wird.

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Textzeile oben in eine bestehende Textdatei einfügen

Beitrag von Richard » 05.04.2018 17:49:09

Hab es jetzt so gemacht (bisher aber ohne intensivere Tests):

Code: Alles auswählen

var1=$(find /home/richard/ -name "*.log")
var2=b=$(cat /home/richard/zusammen.log)
awk 1 $var1 > /home/richard/zusammen.log
sleep 1
echo "$var2" >> /home/richard/zusammen.log
Das sleep scheint nötig zu sein. Ohne sleep hatte ich immer 2x den Wert aus 'var1' drin. Wenn ich ohne sleep var2 in eine separate Datei geschrieben habe war da aber der korrekte Wert aus var2. Ich muss so keine temporäre Datei erstellen und wieder löschen oder umbenennen. Da bin ich nicht so Freund von.

Antworten