Der sed
Ansatz ist in Ordnung, aber alle Linien zu durchlaufen ist es nicht. Wenn Sie wissen, wie viele Zeilen Sie behalten möchten (um ein Beispiel zu haben, ich verwende hier 99), können Sie es so machen:
sed -i '100,$ d' myfile.txt
Erläuterung:sed
ist ein Prozessor für reguläre Ausdrücke. Mit der Option -i
gegeben, verarbeitet es eine Datei direkt ("inline") -- anstatt sie nur zu lesen und die Ergebnisse auf die Standardausgabe zu schreiben. 100,$
bedeutet einfach "von Zeile 100 bis zum Ende der Datei" -- gefolgt von dem Befehl d
, was Sie wahrscheinlich richtig erraten haben, um für "Löschen" zu stehen. Kurz gesagt bedeutet der Befehl also:„Lösche alle Zeilen von Zeile 100 bis zum Ende der Datei aus myfile.txt“. 100 ist die erste zu löschende Zeile, da Sie 99 Zeilen behalten möchten.
Bearbeiten: Wenn es andererseits Logdateien gibt, in denen Sie z.B. die letzte 100 Zeilen:
[ $(wc -l myfile.txt) -gt 100 ] && sed -i "1,$(($(wc -l myfile.txt|awk '{print $1}') - 100)) d" myfile.txt
Was ist hier los:
[ $(wc -l myfile.txt) -gt 100 ]
:Folgendes nur tun, wenn die Datei mehr als 100 Zeilen hat$((100 - $(wc -l myfile.txt|awk '{print $1}')))
:Berechnen Sie die Anzahl der zu löschenden Zeilen (d. h. alle Zeilen der Datei außer den (letzten) 100, die behalten werden sollen)1, $((..)) d
:alle Zeilen von der ersten bis zur berechneten Zeile entfernen
BEARBEITEN: Da die Frage nur bearbeitet wurde, um weitere Details zu geben, werde ich diese zusätzlichen Informationen auch in meine Antwort aufnehmen. Hinzugefügte Fakten sind:
- eine bestimmte Größe verbleiben bei der Datei (10.000 Byte)
- jede Zeile hat eine bestimmte Größe in Bytes (300 Bytes im Beispiel)
Aus diesen Daten lässt sich die Anzahl der verbleibenden Zeilen als " / " berechnen, was im Beispiel 33 Zeilen bedeuten würde. Der Shell-Term für die Berechnung:$((size_to_remain / linesize))
(Zumindest unter Linux mit Bash ist das Ergebnis eine ganze Zahl). Der angepasste Befehl würde nun lauten:
# keep the start of the file (OPs question)
sed -i '34,$ d' myfile.txt
# keep the end of the file (my second example)
[ $(wc -l myfile.txt) -gt 33 ] && sed -i "1,33 d" myfile.txt
Da die Größen im Voraus bekannt sind, ist keine in sed
eingebettete Berechnung mehr erforderlich Befehl. Aber aus Gründen der Flexibilität kann man in einigen Shell-Skripten Variablen verwenden.
Für eine bedingte Verarbeitung basierend auf der Dateigröße kann man folgendes "test"-Konstrukt verwenden:
[ "$(ls -lk $file | awk ' {print $5}')" -gt 100 ] &&
was bedeutet:"Wenn die Größe $file
100 KB überschreitet, tun Sie..." (ls -lk
listet die Dateigröße in kB an Position 5 auf, also awk
wird verwendet, um genau diese zu extrahieren).