web-dev-qa-db-fra.com

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

Les commandes suivent 

  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 par history -d 511, mais comment supprimer l'historique des 10 dernières commandes et entre 10 commandes à l'aide d'une seule commande dans un shell?

Pouvons-nous écrire un script bash et l'exécuter pour supprimer l'historique?

107
Justin John

Avez-vous essayé de modifier le fichier d'historique directement:

~/.bash_history
99
WheretheresaWill

Ma réponse est basée sur les réponses précédentes, mais avec l'ajout de l'inversion de la séquence afin que les éléments de l'historique soient supprimés des plus récents aux moins récents.

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 également supprimer la commande de suppression de l'historique, la procédure est un peu plus compliquée, car vous devez connaître l'entrée actuelle maximale de l'historique.

Vous pouvez obtenir ceci avec (il y a peut-être un meilleur moyen): 

history 1 | awk '{print $1}'

En l'associant, vous pouvez l'utiliser pour supprimer une plage, ainsi que pour supprimer la commande history delete:

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

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

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

Exemple de suppression des commandes 4, 5 et 6 (1049-1051) et masquage des preuves:

[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'historique. Si vous souhaitez économiser un peu d'effort, vous pouvez utiliser une autre fonction pour appeler la fonction histdel qui effectue les calculs à votre place.

histdeln(){

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

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

Cette fonction prend 1 argument, le nombre d'éléments de l'historique précédents à supprimer. Donc, pour supprimer les 10 dernières commandes de l’historique, utilisez simplement histdeln 10.

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

Combinaison des réponses ci-dessus:

history -w vi ~/.bash_history history -r

11
Bryant Bernstein

Tout d'abord, tapez: history et notez la séquence de numéros de ligne que vous souhaitez supprimer.

Pour effacer les lignes des lignes 1800 à 1815, écrivez ce qui suit dans le terminal:

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

Si vous souhaitez supprimer l'historique de la commande de suppression, ajoutez +1 pour 1815 = 1816 et l'historique de cette séquence + la commande de suppression seront supprimés.

Par exemple : 

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

modifier:

Changé les itérateurs calés, bon appel. Appelez également cette fonction avec un itérateur inversé.

Vous pouvez probablement faire quelque chose comme ça:

#!/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

Où tu vas évoquer comme ça:

./nameOfYourScript 563 514

Remarquez que je n'ai mis aucune erreur en vérifiant les limites. Je laisserai cela comme un exercice au lecteur.

voir aussi cette question

9
Tyler Jandreau

Peut-être sera utile pour quelqu'un.
Lorsque vous vous connectez à n’importe quel utilisateur d’une console/d’un terminal, l’historique de votre session actuelle n’existe que dans un "tampon" qui se vide à ~/.bash_history lors de votre déconnexion.
Donc, pour garder le secret, vous pouvez simplement:
history -r && exit
et vous serez déconnecté avec l'historique de votre session (et uniquement) effacé;)

8
Alex

Avec Bash 5, vous pouvez maintenant faire une gamme ... Hourra !:

history -d 511-520

ou compter à rebours 10:

history -d -10--1

Extrait de Bash 5 Man Page :

'l'histoire'

Les options, si elles sont fournies, ont les significations suivantes:

'-d OFFSET' Supprimer l’entrée de l’historique à la position OFFSET. Si OFFSET est positif, il convient de le spécifier tel qu’il apparaît lorsque le l'histoire est affichée. Si OFFSET est négatif, il est interprété comme relatif à un plus grand que la dernière histoire position, donc les indices négatifs comptent à partir de la fin du histoire, et un index '-1' fait référence à la 'histoire actuelle -d 'commande.

'-d START-END' Supprimer les entrées d’historique entre les positions START et END, compris. Les valeurs positives et négatives pour START et END sont interprété comme décrit ci-dessus.

Voici ma solution pour 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 effacera tous les historiques.

2
user6280539

J'ai utilisé une combinaison de solutions partagées dans ce fil pour effacer la trace dans l'historique des commandes ..__ Tout d'abord, j'ai vérifié où est enregistré l'historique des commandes avec:

echo $HISTFILE

J'ai édité l'histoire avec:

vi <pathToFile>

Après cela, je vide le tampon de l'historique de session en cours avec:

history -r && exit

La prochaine fois que vous entrerez dans cette session, la dernière commande que vous verrez dans l'historique des commandes est la dernière que vous avez laissée dans pathToFile

1
M. Gleria

J'utilise ce script pour supprimer les 10 dernières commandes de l'historique:

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

Il utilise $HISTCMD environment var pour obtenir l'index d'historique et l'utilise pour supprimer les 10 dernières entrées de history.

1
Junaid

Essayez ce qui suit:

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

Une simple fonction peut tout tuer par son numéro (même si elle ne tient pas compte des 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
steveo'america

J'utilise ceci (j'ai 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
}

Les parties builtin history ainsi que le dernier -w sont dus au fait que j’ai mis en place une variante des fameux astuces pour partager l’historique entre terminaux et que cette fonction serait interrompue sans ces parties. Ils assurent un appel à la vraie bash history intégrée (et non à mon propre encapsuleur), et écrivent l’historique dans HISTFILE juste après la suppression des entrées.

Cependant, cela fonctionnera tel quel avec les configurations d'historique "normales".

Vous devez l’appeler avec le nombre de dernières entrées à supprimer, par exemple:

histrm 10

Supprime les 10 dernières entrées.

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}')

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

0
Wasef Anwar