Comment supprimer l'historique des 10 dernières commandes dans le shell?

commandes suit

  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

je peux supprimer une seule commande par history -d 511 , mais comment supprimer les 10 dernières commandes et dans l'historique de 10 commandes en utilisant une seule commande dans l'interpréteur de commandes?

pouvons-nous écrire un script bash et exécuter pour supprimer l'histoire?

99
demandé sur Justin John 2013-02-07 16:02:07

12 réponses

avez-vous essayé d'éditer le fichier d'histoire directement:

~/.bash_history
91
répondu WheretheresaWill 2016-11-29 10:46:31

ma réponse est basée sur des réponses précédentes, mais avec l'ajout d'inverser la séquence de sorte que les éléments de l'histoire sont supprimés de la plus récente à la moins récente.

obtenez votre historique actuel (ajustez le nombre de lignes que vous voulez voir):

history | tail -n 10

cela me donne quelque chose comme

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"

sélectionnez les positions de début et de fin pour les éléments que vous souhaitez supprimer. Je vais supprimer les entrées 1006 à 1008.

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

cela générera des commandes history -d pour 1008 puis 1007 puis 1006.

si je voulais aussi supprimer la commande history delete, alors c'est un peu plus compliqué parce que vous avez besoin de connaître l'entrée courante max history.

Vous pouvez l'obtenir avec (il peut y avoir une meilleure façon):

history 1 | awk '{print }'

en le mettant ensemble, vous pouvez utiliser ceci pour supprimer une gamme, et aussi supprimer le supprimer la commande:

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

Envelopper tout cela dans une fonction à ajouter à votre ~/.bashrc :

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

exemple de suppression de la commande 4, 5 et 6 (1049-1051) et de dissimulation de la preuve:

[18:21:02 jonathag@gb-slo-svb-0221 ~]$ 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 jonathag@gb-slo-svb-0221 ~]$ histdel 1049 1051
[18:21:23 jonathag@gb-slo-svb-0221 ~]$ 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

la question était en fait de supprimer les 10 dernières commandes de l'histoire, donc si vous voulez économiser un peu d'effort, vous pourriez utiliser une autre fonction pour appeler la fonction histdel qui fait les calculs pour vous.

histdeln(){

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

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

cette fonction prend 1 argument, le nombre d'articles d'histoire antérieurs à supprimer. Ainsi, pour supprimer les 10 dernières commandes de l'histoire, utilisez simplement histdeln 10 .

44
répondu JGC 2018-08-20 19:02:58
for x in `seq  `
do
  history -d 
done
25
répondu Barmar 2013-02-07 12:36:58

edit:

a changé les itérateurs, bien vu. Aussi, appeler cette fonction avec un itérateur inverse.

vous pouvez probablement faire quelque chose comme ceci:

#!/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  `;
do
    history -d $i
done
history -w

où vous évoquerez comme ceci:

./nameOfYourScript 563 514

avis je n'ai pas mis de vérification d'erreur pour les limites. Je vais laisser ça comme un exercice pour le lecteur.

voir aussi cette question

9
répondu Tyler Jandreau 2017-04-13 12:22:42

tapez D'abord history et écrivez la séquence des numéros de ligne que vous voulez supprimer.

pour effacer les lignes de la ligne 1800 à 1815 écrivent ce qui suit dans le terminal:

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

si vous voulez supprimer l'historique de la commande suppression, ajouter +1 pour 1815 = 1816 et l'historique de cette séquence + la commande suppression sera supprimée.

par exemple:

$ for line in $(seq 1800 1816) ; do history -d 1800; done
9
répondu Ghassan Zein 2016-04-13 09:32:23

en Combinant les réponses ci-dessus:

history -w vi ~/.bash_history history -r

7
répondu Bryant Bernstein 2017-09-21 03:57:31

Peut-être sera utile pour quelqu'un.

Lorsque vous vous connectez à n'importe quel utilisateur de n'importe quelle console/terminal l'histoire de votre session courante n'existe que dans un "tampon" qui va vers ~/.bash_history sur votre déconnexion.

Donc, pour garder les choses secrètes vous pouvez juste:

history -r && exit

et vous serez connecté avec tous vos session (et uniquement) de l'histoire effacée ;)

6
répondu Alex 2017-10-27 12:17:17

histoire-c effacera toutes les histoires.

2
répondu user6280539 2016-05-02 09:20:42
for h in $(seq $(history | tail -1 | awk '{print -N}')  $(history | tail -1 | awk '{print }') | tac); do history -d $h; done; history -d $(history | tail -1 | awk '{print }')

si vous voulez supprimer 10 lignes, changez simplement la valeur de N en 10.

0
répondu Wasef Anwar 2016-11-30 17:34:38

une fonction simple peut tuer tout par nombre (bien qu'elle BARF sur les erreurs)

kill_hist() {
    for i in $(echo $@ | 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
répondu steveo'america 2017-05-31 22:40:05

j'utilise ce script pour supprimer les 10 dernières commandes de l'histoire:

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

il utilise $HISTCMD environnement var pour obtenir l'index d'histoire et utilise cela pour supprimer les 10 dernières entrées dans history .

0
répondu Junaid 2018-09-11 14:35:10

pour supprimer les 10 dernières entrées (sur la base de votre exemple):

history -d 511 520
-1
répondu ThePhilosopher 2018-05-27 19:23:21