Löschen Sie die letzten N Zeilen aus dem Bash-Verlauf


40

Beim versehentlichen Einfügen einer Datei in die Shell werden eine Menge hässlicher Unsinneinträge in den Bash-Verlauf eingefügt. Gibt es eine saubere Möglichkeit, diese Einträge zu entfernen? Natürlich könnte ich die Shell schließen und die .bash_historyDatei manuell bearbeiten, aber vielleicht gibt es eine API, um den Verlauf der aktuellen Shell zu ändern?

Antworten:


36

Sie können history -d offsetbuiltin verwenden, um eine bestimmte Zeile aus dem Verlauf der aktuellen Shell zu löschen oder history -cum den gesamten Verlauf zu löschen .

Es ist nicht wirklich praktisch, wenn Sie einen Bereich von Zeilen entfernen möchten, da nur ein Offset als Argument verwendet wird, aber Sie können ihn in eine Funktion mit einer Schleife einschließen.

rmhist() {
    start=$1
    end=$2
    count=$(( end - start ))
    while [ $count -ge 0 ] ; do
        history -d $start
        ((count--))
    done
}

Nennen Sie es mit rmhist first_line_to_delete last_line_to_delete. (Zeilennummern entsprechend der Ausgabe von history.)

(Verwenden Sie history -wdiese Option , um ein Schreiben in die Verlaufsdatei zu erzwingen.)


1
Da das OP nach dem Löschen der N letzten Zeilen gefragt hat , sollte dieses Skript folgendermaßen geändert werden: tot_lines=$(history | wc -l)und dann wiederholt werden history -d $(( tot_lines - $1 )).
PlasmaBinturong

2
Stattdessen $(history | wc -l)gibt es die Variable $HISTCMD, die verwendet werden kann.
PlasmaBinturong

29

Nur diese eine Zeile in der Eingabeaufforderung hilft.

for i in {1..N}; do history -d START_NUM; done

Wobei START_NUM die Startposition des Eintrags in der Historie ist. N ist die Anzahl der Einträge, die Sie löschen möchten.

Ex: for i in {1..50}; do history -d 1030; done


3
Ich frage mich, warum dies nicht bereits eine eingebaute Funktion ist. "Geschichte" ist ein sehr altes Werkzeug.
Petr Gladkikh

dient dem Zweck sehr gut, aber dieser Befehl kann in der Geschichte gesehen werden :)
Rajeev Akotkar

askubuntu.com/a/978276/22866 hat eine schöne Möglichkeit, den Befehl "Aus Verlauf löschen" aus dem Verlauf zu löschen :-)
HanSooloo

0

Die Antwort von user2982704 hat bei mir fast geklappt aber nicht ganz. Ich musste eine kleine Variation davon machen.

Angenommen, mein Verlauf liegt bei 1000 und ich möchte die letzten 50 Einträge löschen

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.