Comment supprimer une seule ligne de l'historique?

Réponses:

340

Mesures préventives

Si vous souhaitez exécuter une commande sans l'enregistrer dans l'historique, ajoutez-y un espace supplémentaire.

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

Pour que cela fonctionne, vous avez besoin de l'un ignorespaceou ignorebothde l'autre HISTCONTROL. Par exemple, exécutez

HISTCONTROL=ignorespace

Pour rendre ce paramètre persistant, mettez-le dans votre .bashrc.

Nettoyage post mortem

Si vous avez déjà exécuté la commande et souhaitez la supprimer de l'historique, utilisez d'abord

history

pour afficher la liste des commandes de votre historique. Recherchez le numéro à côté de celui que vous souhaitez supprimer (par exemple 1234) et lancez

history -d 1234

De plus, si la ligne que vous souhaitez supprimer a déjà été écrite dans votre $ HISTFILE (ce qui se produit généralement lorsque vous terminez une session par défaut), vous devrez écrire à $ HISTFILE, sinon la ligne réapparaîtra lorsque vous ouvrirez une nouvelle session. session:

history -w
jw013
la source
Ça a marché. Je pense que nous devons rechercher ~ / .bashrc après l'avoir modifié ...
B Seven
3
@ jw013 J'ai défini PROMPT_COMMAND sur history -a, dans ce cas, il est déjà écrit dans le fichier d'historique, plutôt que sur la sortie sous une configuration normale. Plus précisément: mywiki.wooledge.org/BashFAQ/088
jordanm
5
Après avoir supprimé une seule ligne, vous devez écrire l’historique actuel dans votre $ HISTFILE avec history -w. Sinon, quand vous quittez, la ligne supprimée est toujours là!
Felipe Alvarez
1
+1 au commentaire ci-dessus; utiliser history -wafter history -d {num}était exactement ce dont j'avais besoin - cette information critique devait être ajoutée à la réponse, sinon un utilisateur pourrait penser qu'une suppression temporaire du shell actuel est en réalité permanente.
michael
1
@BobStein history -west nécessaire pour les entrées déjà écrites dans le .bash_historyfichier. Comment reproduire (par exemple sur CentOS 7 avec configuration du stock): 1. login 2. entrez la commande echo foo3. déconnectez-vous 4. reconnectez-vous 5. supprimez l'entrée pour echo foo6. déconnectez-vous 7. reconnectez-vous: l'entrée est toujours là. En fonction de la manière dont vous configurez votre historique bash, vous pouvez peut-être reproduire ce problème autrement, par exemple si vous provoquez l'écriture de l'historique avant la déconnexion.
maxschlepzig
53
  1. Pour effacer toute votre histoire, utilisez

    history -c
  2. Pour supprimer une seule ligne, utilisez

    history -d linenumber
Soumyaranjan
la source
6

J'ai ceci dans mon ~/.bashrc, ce qui fait que la commande $ forgetsupprime la commande précédente de l'historique

function forget() {                                                              
   history -d $(expr $(history | tail -n 1 | grep -oP '^ \d+') - 1);              
}
Ryan Haining
la source
Cela semble un peu compliqué. Ne serait pas history -d $( history | tail -n 1 | cut -f 1 -d " " )plus simple?
seumasmac
1
history | tail -n1est la historycommande elle-même, la suppression de ce numéro donne une mauvaise entrée. Cependant, history -d $( history | awk 'END{print $1-1}' )combine la sélection de ligne, la sélection de champ et la soustraction.
dave_thompson_085
Y a-t-il une chance que quelqu'un puisse aider avec ça à Zshell?
Alex S
6

Vous pouvez toujours éditer et supprimer des entrées de ~/.bash_history, utile lorsque vous souhaitez supprimer une entrée ou plusieurs entrées.

Weslor
la source
2
Très probablement, ces entrées seront réintroduites lorsque vous quitterez le shell.
l0b0
5

Si vous voulez oublier toute la session bash, vous pouvez killutiliser le processus bash en cours. Puisque la variable $$contient le pidshell actuel, vous pouvez faire:

kill -9 $$
Bruno Bronosky
la source
1

Vous devez écrire les modifications après avoir effacé l'historique. Et si vous ne souhaitez pas que la commande history wipe soit dans votre historique, vous devez exécuter la commande comme suit:

history -c && history -w && logout

Bonne chance.

utilisateur882786
la source
-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
la source