Wie entferne ich eine einzelne Zeile aus dem Verlauf?

Antworten:

338

Vorbeugende Maßnahmen

Wenn Sie einen Befehl ausführen möchten, ohne ihn im Verlauf zu speichern, müssen Sie ihm ein zusätzliches Leerzeichen voranstellen

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space

Dafür benötigen Sie entweder ignorespaceoder ignorebothin HISTCONTROL. Führen Sie beispielsweise aus

HISTCONTROL=ignorespace

Um diese Einstellung dauerhaft zu erhalten, legen Sie sie in Ihrer .bashrc.

Obduktionssanierung

Wenn Sie den Befehl bereits ausgeführt haben und ihn aus dem Verlauf entfernen möchten, verwenden Sie zuerst

history

um die Liste der Befehle in Ihrem Verlauf anzuzeigen. Suchen Sie die Nummer neben der Nummer, die Sie löschen möchten (z. B. 1234), und führen Sie sie aus

history -d 1234

Wenn die zu löschende Zeile bereits in Ihre $ HISTFILE geschrieben wurde (was normalerweise geschieht, wenn Sie eine Sitzung standardmäßig beenden), müssen Sie in $ HISTFILE zurückschreiben, oder die Zeile wird erneut angezeigt, wenn Sie eine neue öffnen Session:

history -w
jw013
quelle
Es funktionierte. Ich denke, wir müssen ~ / .bashrc beschaffen, nachdem wir es modifiziert haben ...
B Seven
3
@ jw013 Ich habe PROMPT_COMMAND auf gesetzt history -a. In diesem Fall wird es bereits in die Verlaufsdatei geschrieben und nicht beim Beenden in der normalen Konfiguration. Insbesondere: mywiki.wooledge.org/BashFAQ/088
jordanm
5
Nach dem Löschen einer einzelnen Zeile müssen Sie den aktuellen Verlauf mit in Ihre $ HISTFILE schreiben history -w. Andernfalls ist die gelöschte Zeile beim Verlassen noch vorhanden!
Felipe Alvarez
1
+1 zum obigen Kommentar; Verwenden von history -wAfter history -d {num}war genau das, was ich brauchte - dieses kritische Leckerbissen sollte der Antwort hinzugefügt werden, sonst könnte ein Benutzer denken, dass ein temporäres Löschen aus der aktuellen Shell tatsächlich permanent ist.
Michael
1
@BobStein history -wist für Einträge erforderlich, die bereits in die .bash_historyDatei geschrieben wurden. So reproduzieren Sie (z. B. unter CentOS 7 mit Standardkonfiguration): 1. Anmelden 2. Befehl eingeben echo foo3. Abmelden 4. Erneut anmelden 5. Eintrag löschen für echo foo6. Abmelden 7. Erneut anmelden: Eintrag ist noch vorhanden. Je nachdem, wie Sie Ihren Bash-Verlauf konfiguriert haben, können Sie dieses Problem möglicherweise auf andere Weise reproduzieren - z. B. wenn Sie das Schreiben des Verlaufs vor dem Abmelden provozieren.
Maxschlepzig
53
  1. Verwenden Sie, um den gesamten Verlauf zu löschen

    history -c
  2. Verwenden Sie, um eine einzelne Zeile zu löschen

    history -d linenumber
Soumyaranjan
quelle
6

Ich habe dies in meinem ~/.bashrc, was bewirkt, dass der Befehl $ forgetden vorherigen Befehl aus dem Verlauf löscht

function forget() {                                                              
   history -d $(expr $(history | tail -n 1 | grep -oP '^ \d+') - 1);              
}
Ryan Haining
quelle
Das scheint etwas kompliziert zu sein. Wäre es nicht history -d $( history | tail -n 1 | cut -f 1 -d " " )einfacher?
Seumasmac
1
history | tail -n1ist der historyBefehl selbst, so dass das Löschen dieser Nummer den falschen Eintrag erhält. Allerdings history -d $( history | awk 'END{print $1-1}' )verbindet die Zeilenauswahl, Feldauswahl, und Subtraktion.
Dave_thompson_085
Gibt es eine Chance, dass jemand helfen kann, dies zu portieren?
Alex S
6

Sie können Einträge immer bearbeiten und daraus entfernen. Dies ~/.bash_historyist nützlich, wenn Sie einen oder mehrere Einträge entfernen möchten

Weslor
quelle
2
Höchstwahrscheinlich werden diese Einträge beim Verlassen der Shell wieder eingefügt.
l0b0
5

Wenn Sie die gesamte Bash-Sitzung vergessen möchten, können Sie killden aktuellen Bash-Vorgang ausführen. Da die Variable $$die pidder aktuellen Shell enthält, können Sie Folgendes tun:

kill -9 $$
Bruno Bronosky
quelle
1

Sie müssen die Änderungen schreiben, nachdem Sie den Verlauf gelöscht haben. Und wenn Sie den Befehl "history wipe" nicht in Ihrem Verlauf haben möchten, müssen Sie den Befehl folgendermaßen ausführen:

history -c && history -w && logout

Viel Glück.

user882786
quelle
-1
Adding another point suppose if you want to delete a range of history lines

You can use below script. 

Below example will delete history output from line 1 to line 150.

for i in `history | awk 'NR > 1 && NR <=150{print   $1}'`; do history -d $i; done
Praveen Kumar BS
quelle