it-swarm.com.de

Wie lösche ich den Verlauf der letzten 10 Befehle in der Shell?

Befehle folgen 

  511  clear
  512  history
  513  history -d 505
  514  history
  515  history -d 507 510 513
  516  history
  517  history -d 509
  518  history
  519  history -d 511
  520  history

Ich kann einzelne durch history -d 511 löschen, aber wie lösche ich die letzten 10 Befehle und dazwischen die 10 Befehle mit einem einzigen Befehl in der Shell?

Können wir ein Bash-Skript schreiben und zum Löschen der Historie ausführen?

107
Justin John

Haben Sie versucht, die Verlaufsdatei direkt zu bearbeiten:

~/.bash_history
99

Meine Antwort basiert auf den vorherigen Antworten, jedoch mit dem Zusatz, dass die Reihenfolge umgekehrt wird, so dass die Verlaufselemente vom letzten bis zum jüngsten gelöscht werden.

Holen Sie sich Ihren aktuellen Verlauf (passen Sie die Anzahl der Zeilen an, die Sie sehen möchten):

history | tail -n 10

Das gibt mir so etwas

1003  25-04-2016 17:54:52 echo "Command 1"
1004  25-04-2016 17:54:54 echo "Command 2"
1005  25-04-2016 17:54:57 echo "Command 3"
1006  25-04-2016 17:54:59 echo "Command 4"
1007  25-04-2016 17:55:01 echo "Command 5"
1008  25-04-2016 17:55:03 echo "Command 6"
1009  25-04-2016 17:55:07 echo "Command 7"
1010  25-04-2016 17:55:09 echo "Command 8"
1011  25-04-2016 17:55:11 echo "Command 9"
1012  25-04-2016 17:55:14 echo "Command 10"

Wählen Sie die Start- und Endpositionen für die Elemente aus, die Sie löschen möchten. Ich werde die Einträge 1006 bis 1008 löschen.

for h in $(seq 1006 1008 | tac); do history -d $h; done

Dadurch werden history -d-Befehle für 1008, dann für 1007 und dann für 1006 generiert.

Wenn ich auch den Befehl zum Löschen des Verlaufs löschen wollte, ist es etwas komplizierter, da Sie den aktuellen Eintrag für den maximalen Verlauf kennen müssen.

Sie können dies mit (es kann einen besseren Weg geben): 

history 1 | awk '{print $1}'

Wenn Sie es zusammensetzen, können Sie dies zum Löschen eines Bereichs und zum Löschen des Befehls zum Löschen des Verlaufs verwenden:

for h in $(seq 1006 1008 | tac); do history -d $h; done; history -d $(history 1 | awk '{print $1}')

Wickeln Sie das Ganze in eine Funktion, die Sie zu Ihrem ~/.bashrc hinzufügen möchten:

histdel(){
  for h in $(seq $1 $2 | tac); do
    history -d $h
  done
  history -d $(history 1 | awk '{print $1}')
  }

Beispiel Löschen der Befehle 4, 5 und 6 (1049-1051) und Ausblenden der Beweise:

[18:21:02 [email protected] ~]$ history 11
 1046  25-04-2016 18:20:47 echo "Command 1"
 1047  25-04-2016 18:20:48 echo "Command 2"
 1048  25-04-2016 18:20:50 echo "Command 3"
 1049  25-04-2016 18:20:51 echo "Command 4"
 1050  25-04-2016 18:20:53 echo "Command 5"
 1051  25-04-2016 18:20:54 echo "Command 6"
 1052  25-04-2016 18:20:56 echo "Command 7"
 1053  25-04-2016 18:20:57 echo "Command 8"
 1054  25-04-2016 18:21:00 echo "Command 9"
 1055  25-04-2016 18:21:02 echo "Command 10"
 1056  25-04-2016 18:21:07 history 11
[18:21:07 [email protected] ~]$ histdel 1049 1051
[18:21:23 [email protected] ~]$ history 8
 1046  25-04-2016 18:20:47 echo "Command 1"
 1047  25-04-2016 18:20:48 echo "Command 2"
 1048  25-04-2016 18:20:50 echo "Command 3"
 1049  25-04-2016 18:20:56 echo "Command 7"
 1050  25-04-2016 18:20:57 echo "Command 8"
 1051  25-04-2016 18:21:00 echo "Command 9"
 1052  25-04-2016 18:21:02 echo "Command 10"
 1053  25-04-2016 18:21:07 history 11

Die Frage war eigentlich, die letzten 10 Befehle aus der Historie zu löschen. Wenn Sie also etwas Mühe sparen möchten, können Sie eine andere Funktion verwenden, um die histdel-Funktion aufzurufen, die die Berechnungen für Sie übernimmt.

histdeln(){

  # Get the current history number
  n=$(history 1 | awk '{print $1}')

  # Call histdel with the appropriate range
  histdel $(( $n - $1 )) $(( $n - 1 ))
  }

Diese Funktion nimmt 1 Argument an, die Anzahl der vorherigen Verlaufselemente, die gelöscht werden sollen. Um die letzten 10 Befehle aus der Historie zu löschen, verwenden Sie einfach histdeln 10.

51
JGC
for x in `seq $1 $2`
do
  history -d $1
done
27
Barmar

Antworten von oben kombinieren:

history -w vi ~/.bash_history history -r

11

Geben Sie zuerst Folgendes ein: history und notieren Sie sich die Reihenfolge der Zeilennummern, die Sie entfernen möchten.

Um die Zeilen von den Zeilen 1800 bis 1815 zu löschen, schreiben Sie Folgendes in terminal:

$ for line in $(seq 1800 1815) ; do history -d 1800; done

Wenn Sie den Verlauf für den Löschbefehl löschen möchten, fügen Sie +1 für 1815 = 1816 hinzu und der Verlauf für diese Sequenz + der Löschbefehl wird gelöscht.

Zum Beispiel : 

$ for line in $(seq 1800 1816) ; do history -d 1800; done
10
Ghassan Zein

bearbeiten:

Veränderte die abgespannten Iteratoren, guter Ruf. Rufen Sie diese Funktion auch mit einem Reverse-Iterator auf.

Sie können wahrscheinlich so etwas tun:

#!/bin/bash
HISTFILE=~/.bash_history   # if you are running it in a 
                           # non interactive Shell history would not work else
set -o history
for i in `seq $1 $2`;
do
    history -d $i
done
history -w

Wo wirst du so beschwören:

./nameOfYourScript 563 514

Beachten Sie, dass ich beim Einchecken der Grenzen keinen Fehler eingegeben habe. Das überlasse ich dem Leser als Übung.

siehe auch diese Frage

9
Tyler Jandreau

Vielleicht wird es für jemanden nützlich sein.
Wenn Sie sich bei einem Benutzer eines beliebigen Konsolen-/Terminalprotokolls Ihrer aktuellen Sitzung anmelden, gibt es nur einen "Puffer", der bei der Abmeldung auf ~ /.
Um Dinge geheim zu halten, können Sie einfach:
history -r && exit
und Sie werden abgemeldet, wobei der gesamte Verlauf Ihrer Sitzung (und der einzige) gelöscht wird;)

8
Alex

Mit Bash 5 können Sie jetzt eine Reihe von ... Hooray !:

history -d 511-520

oder rückwärts zählen 10:

history -d -10--1

Auszug aus Bash 5 Man Page :

'Geschichte'

Optionen, sofern angegeben, haben folgende Bedeutung:

'-d OFFSET' Löschen Sie den Verlaufseintrag an der Position OFFSET. Wenn OFFSET ist positiv, sollte es so angegeben werden, wie es erscheint, wenn die Historie wird angezeigt. Wenn OFFSET negativ ist, ist es wird als relativ zu einem Wert interpretiert, der größer als der letzte Verlauf ist Position, also zählen negative Indizes vom Ende des history, und ein Index von '-1' bezieht sich auf den aktuellen 'history -d 'Befehl.

'-d START-END' Löschen Sie die Historieneinträge zwischen den Positionen START und END, inklusive. Positive und negative Werte für START und END sind wie oben beschrieben interpretiert.

Hier ist meine Lösung für Bash 4:

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

delHistory 511 520
2
David Hatch

history -c löscht alle Historien.

2
user6280539

Ich habe eine Kombination von Lösungen verwendet, die in diesem Thread gemeinsam verwendet wurden, um die Ablaufverfolgung in der Befehlsverlaufsliste zu löschen ..__ Zuerst wurde überprüft, wo der Befehlsverlauf gespeichert wird:

echo $HISTFILE

Ich habe die Geschichte bearbeitet mit:

vi <pathToFile>

Danach spüle ich den aktuellen Sitzungsprotokollpuffer mit:

history -r && exit

Wenn Sie das nächste Mal an dieser Sitzung teilnehmen, ist der letzte Befehl, den Sie im Befehlsverlauf sehen, der letzte Befehl, den Sie in pathToFile hinterlassen haben. 

1
M. Gleria

Ich verwende dieses Skript, um die letzten 10 Befehle in der Historie zu löschen:

pos=$HISTCMD; start=$(( $pos-11 )); end=$(( $pos-1 )); for i in $(eval echo "{${start}..${end}}"); do history -d $start; done

Es verwendet $HISTCMD environment var, um den Verlaufsindex abzurufen, und löscht die letzten 10 Einträge in history.

1
Junaid

Versuche Folgendes:

for i in {511..520}; do history -d $i; echo "history -d $i"; done
0
rb1234

Eine einfache Funktion kann alle nach Anzahl töten (obwohl sie Fehler enthält)

kill_hist() {
    for i in $(echo [email protected] | sed -e 's/ /\n/g;' | sort -rn | sed -e 's/\n/ /;')
    do
            history -d $i;
    done
}
kill_hist `seq 511 520`
# or kill a few ranges
kill_hist `seq 1001 1010` `seq 1200 1201`
0
steveo'america

Ich benutze das (ich habe bash 4):

histrm() {
    local num=${1:- 1}
    builtin history -d $(builtin history | sed -rn '$s/^[^[:digit:]]+([[:digit:]]+)[^[:digit:]].*$/\1/p')
    (( num-- )) && $FUNCNAME $num
    builtin history -w
}

Der builtin history-Teil sowie der letzte -w ist darauf zurückzuführen, dass ich eine Variation der bekannten Tricks zum Teilen der Geschichte zwischen Terminals verwendet habe und diese Funktion würde ohne diese Teile brechen. Sie stellen sicher, dass das echte bash history builtin (und nicht mein eigener Wrapper) aufgerufen wird, und schreiben die Historie direkt nach dem Entfernen der Einträge in HISTFILE.

Dies funktioniert jedoch genauso wie bei "normalen" Verlaufskonfigurationen.

Sie sollten es mit der Anzahl der letzten Einträge anrufen, die Sie entfernen möchten, zum Beispiel:

histrm 10

Entfernt die letzten 10 Einträge.

0
ata
for h in $(seq $(history | tail -1 | awk '{print $1-N}')  $(history | tail -1 | awk '{print $1}') | tac); do history -d $h; done; history -d $(history | tail -1 | awk '{print $1}')

Wenn Sie 10 Zeilen löschen möchten, ändern Sie einfach den Wert von N in 10.

0
Wasef Anwar