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?
Avez-vous essayé de modifier le fichier d'historique directement:
~/.bash_history
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
.
for x in `seq $1 $2`
do
history -d $1
done
Combinaison des réponses ci-dessus:
history -w
vi ~/.bash_history
history -r
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
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
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é;)
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
history -c effacera tous les historiques.
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 .
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
.
Essayez ce qui suit:
for i in {511..520}; do history -d $i; echo "history -d $i"; done
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`
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.
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.