GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man eine Datei zeilenweise abschneiden?

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).


Linux
  1. Wie entferne ich doppelte Zeilen in einer Textdatei?

  2. So löschen Sie alle Zeilen einer Datei in Vim

  3. Wie man Zeilen in einer Datei in UNIX/Linux zählt

  4. So kürzen Sie /var/log/lastlog-Datei

  5. Wie man nur die Anzahl der Zeilen einer Datei erhält

So kürzen Sie (leere) Dateien in Linux

So verwenden Sie den Truncate-Befehl unter Linux

So drucken Sie doppelte Zeilen in einer Textdatei unter Linux

So mischen Sie Zeilen in einer Datei unter Linux

So kehren Sie Zeilen in einer Datei zeichenweise in Linux um

So finden Sie die längste(n) Zeile(n) in einer Datei in Linux