Comment supprimer les résultats sélectionnés de l'historique bash?


66

historyLa commande affiche tous les résultats mais nous pouvons filtrer pour obtenir une commande particulière en utilisant history | grep searchingCommand. C'est vraiment utile.

Mais le problème est qu'il montre également les commandes qui ont été entrées avec une erreur de frappe ou qui ont échoué. Ensuite, identifier le bon est vraiment pénible. J'ai vérifié ce lien: Historique des commandes sélectives dans le terminal? mais ce n'était pas ma solution.

Donc, y a-t-il un moyen de supprimer ces commandes de l'historique qui était incorrect au moment de l'entrée ou plus tard?


5
S'il vous plaît, changez la réponse acceptée, il y en a d'autres avec plus de 100 votes en plus.
greuze

1
@ Greuze: Changé à la meilleure réponse. Le nombre de votes ne signifie pas que c'est le meilleur!
Saurav Kumar

Réponses:


20

J'aimerais ajouter une autre méthode de modification (ou de suppression) des entrées d'historique, que j'ai trouvée assez accidentellement lorsque je travaillais avec le bash:

Pour illustrer cela, commencez par exécuter les trois commandes suivantes dans bash:

$ echo 1
1
$ echo 2
2
$ echo 3
3

Vous pouvez maintenant sélectionner à nouveau ces commandes en utilisant les touches fléchées ou Ctrl+ pet Ctrl+ n.

Supposons que vous souhaitiez modifier les deux premières commandes. Parcourez l'historique jusqu'à ce qu'il echo 1apparaisse et remplacez-le par echo 1 - changed, mais NE PAS APPUYER SUR ENTREE. Si vous avancez maintenant dans votre historique, cette ligne reste dans son état modifié et vous pouvez vous en éloigner et y revenir. Maintenant, déplacez-vous sur la ligne echo 2et remplacez-la par echo 2 - changed, encore une fois, n'appuyez pas sur entrée. Pour enregistrer les modifications apportées à ces lignes, sélectionnez une commande de l’historique, à l’exception de ces deux-là, et appuyez sur Ctrl+ c.

Bien sûr, au lieu de modifier l’entrée d’historique, vous pouvez également la supprimer, ce qui donnera une ligne vide à cette entrée. Pour supprimer la ligne actuellement affichée à l'invite, appuyez sur Ctrl+ e(qui passe à la fin de la ligne), puis sur Ctrl+ u(qui supprime le texte du début de la ligne au curseur).

Voir aussi https://unix.stackexchange.com/questions/195668/what-can-cause-an-item-to-be-deleted-from-my-bash-history/195726#195726 pour une explication plus détaillée de la contexte technique.

Manière la plus simple:

  1. ctrl+ rpour rechercher la commande que vous souhaitez supprimer / modifier.
  2. end sélectionner la commande recherchée pour supprimer / modifier
  3. Supprimer ou modifier la commande sélectionnée (ne pas appuyer sur enterou ctrl+ c)
  4. flèche haut (ou ctrl+ p) ou flèche bas (ou ctrl+ n) pour sélectionner une autre commande.
  5. ctrl+ c C'est ça!

Note :

Cela ne change que les commandes de la session en cours. Si nous voulons modifier les anciennes commandes et enregistrer les modifications, nous devons exécuter la commande suivante avant de fermer le terminal:

history -w

Merci beaucoup Stefan! Je dois dire que vous avez apporté des choses incroyables. En utilisant ceci, j'ai trouvé le moyen le plus simple de modifier / supprimer l'historique: 1.ctrl+r Rechercher la commande que vous souhaitez supprimer / modifier. 2.end pour déplacer la commande et supprimer / modifier la commande. 3.ctrl+n pour aller à la ligne suivante puis 4.ctrl+c
Saurav Kumar

144

Utilisation:

history -d OFFSET

pour supprimer l’entrée d’historique décalée OFFSETmême avant son ajout à votre fichier d’historique bash. Pour trouver le bon OFFSET, il suffit de lancer la historycommande. C'est le numéro à partir du début de la ligne qui contient l'entrée de l'historique que vous souhaitez supprimer.

Et pour sauvegarder les modifications apportées à l’utilisation de l’historique:

history -w

Voir plus de détails dans ce guide .


pas mal :) Bon pour trouver un nouveau moyen ..
Saurav Kumar

10
@SauravKumar Pas mal?!? Probablement le meilleur moyen ...
Radu Rădeanu

5
LIRE EN PREMIER: Pour que tout soit clair, vous devez utiliser des history -wmots suivants pour enregistrer les modifications. OFFSET signifie également quel numéro est historyaffiché. Si la ligne que vous essayez de supprimer est 873, utilisez history -d 873.
Cammy_the_block

2
@ RaduRădeanu Utilisez history -waprès history -dpour enregistrer les modifications.
Cammy_the_block

20
Cela devrait être la bonne réponse.
Topher

19

Editez le fichier ~/.bash_historyet effacez une fois les fautes de frappe

Par exemple, insérez cette commande:

gedit ~/.bash_history

Éditez quelque chose que vous aimez et après que sauvegardez le fichier et redémarrez le terminal. La commande racine est:

sudo -i 
inser your password
gedit ~/.bash_history

si vous voulez supprimer tout history -cdevrait faire l'affaire


SYNTAXE

history
history [n]
history -c
history -d offset
history [-anrw] [filename]
history -ps arg

CLÉ

-c Efface la liste de l'historique. Ceci peut être combiné avec les autres options pour remplacer complètement la liste de l'historique.

-d offset Supprime l'entrée d'historique au décalage de position. l'offset doit être spécifié tel qu'il apparaît lorsque l'historique est affiché.

-a Ajoute les nouvelles lignes d'historique (lignes d'historique entrées depuis le début de la session Bash en cours) au fichier d'historique.

-n Ajoute les lignes d'historique non lues du fichier d'historique à la liste d'historique actuelle. Ce sont des lignes ajoutées au fichier d’historique depuis le début de la session Bash en cours.

-r Lit le fichier d'historique actuel et ajoute son contenu à la liste d'historique.

-w Ecrit l'historique actuel dans le fichier historique.

-p Effectue une substitution d'historique sur les arguments et affiche le résultat sur la sortie standard, sans stocker les résultats dans la liste d'historique.

-s Les arguments sont ajoutés à la fin de la liste de l'historique en tant qu'entrée unique.

source :


Merci c'est utile! Savez-vous comment supprimer l'entrée au moment où elle est entrée en ligne de commande? Ou existe-t-il une commande permettant de supprimer l'entrée sans ouvrir le fichier .bash_history?
Saurav Kumar

1
@ bladed19899 history -cne fonctionne pas Lorsque je ferme le terminal et que je l'ouvre à nouveau, l'historique n'est pas supprimé. -1 votre réponse
αsнιη

1
@KasiyA, -c Clear the history list. This may be combined with the other options to replace the history list completely. source
blade19899

2
@KasiyA Utilisez history -waprès history -cpour écrire les modifications.
Cammy_the_block

16

Si vous voulez le supprimer immédiatement du même terminal, vous devez ajouter ce qui suit dans votre fichier ~ / .bashrc.

PROMPT_COMMAND='history -a' 

et redémarrez votre terminal.

Vous pouvez l'ajouter n'importe où dans le fichier .bashrc .J'ai ajouté comme ci-dessous, ainsi que d'autres éléments liés à l'historique.

entrez la description de l'image ici

Habituellement, pendant une session bash, les commandes exécutées ne sont pas écrites dans .bash_history tant que la session n'est pas terminée, il faut donc PROMPT_COMMAND='history -a'entrer la commande à cet endroit et ensuite dans .bash_history.

Maintenant, chaque fois que vous faites une erreur ou une erreur dans une commande et que vous voulez le supprimer, exécutez la commande suivante

sed -i '$d' ~/.bash_history

et tada il serait supprimé.

Pour simplifier les choses, vous pouvez créer un alias plus simple et l’utiliser comme

alias rh ='sed -i '\''$d'\'' ~/.bash_history'

Ainsi, l'exécution rhsupprimera la dernière commande exécutée de l'historique.

Ce qui précède est un alias temporaire qui ne dure que pour une session. Pour le rendre permanent ou persistant, ajoutez

alias rh = 'sed -i '\''$d'\'' ~/.bash_history' 

à .bashrc

REMARQUE

Il ne devrait y avoir aucun espace des deux côtés de =

Si vous ne voulez pas alias, vous pouvez également procéder comme suit

Créez un nom de commande rhet placez-le dans le /binrépertoire:

  • Ouvrez un fichier rhet collez le code suivant, enregistrez et fermez:

    sed -i '$d' ~/.bash_history

  • Rendre rhexécutable et le placer dans le /binrépertoire:

     chmod + x rh
     sudo cp rh / bin 
  • Maintenant, utilisez la rhcommande pour supprimer la commande récente de l'historique.


Où ajouter PROMPT_COMMAND='history -a'dans le .bashrcfichier? Et que fera-t-il exactement? J'ai essayé sed -i '$d' ~/.bash_historyça marche sans montage .bashrc!! Mais le truc du pseudo ne marche pas. J'accepterai votre réponse si vous développez simplement ma question et faites en sorte que le pseudonyme fonctionne ... :)
Saurav Kumar le

@SauravKumar ont modifié la réponse. Avait manqué les guillemets simples et doubles dans la commande aliasing .. Mon mauvais ..: P
Stormvirux

Croyez-moi ou non .. la fonction alias ne fonctionne toujours pas .. Elle s'exécute sans erreur, mais ne supprime pas l'entrée du .bash_historyfichier ..: P de toute façon .. Pas de problème .. J'ai créé ma propre commande et l'ai placée dans /binannuaire. Depuis à cause de votre commande: sed -i "$d" ~/.bash_historycela fonctionne bien. J'accepte votre réponse .. :)
Saurav Kumar

Si vous le permettez, j'aimerais modifier votre réponse afin qu'elle soit utile aux autres ..
Saurav Kumar

En fait je l'ai édité. Vous devez l'approuver ..
Saurav Kumar

2

pour supprimer plusieurs lignes (par exemple de 1974 à 1990, vérifiez avec historycommande):

  for i in `seq 1974 1990` ; do history -d 1974 ; done

notez que le numéro de ligne à supprimer est toujours le même, puisque vous supprimez celui-ci constamment et passez au suivant.


La note est très importante.
Weijun Zhou

1

Si vous utilisez l'option "set -o vi" dans bash (très utile pour rechercher en arrière avec la touche Echap), vous pouvez alors rechercher la ligne et supprimer la ligne avec "dd" comme vous le faites avec "vi".


Je trouve que je dois taper jou kaprès ddpour le faire effacer la commande de l'historique. Si je tape une autre commande ou si je presse simplement Enter, bash semble supposer qu'il ne s'agit que d'une nouvelle commande et qu'il devrait conserver l'ancienne commande dans l'historique. Il est également intéressant de noter que, une fois l’opération effectuée correctement, la commande est effacée, mais ne la supprime pas. Le résultat est des entrées d’historique vierges. Mais c’est suffisant pour supprimer les mots de passe que j’ai été obligé de taper à la ligne de commande, et beaucoup plus facile que d’autres réponses, alors merci beaucoup de l’avoir posté!
Michael Scheper

0

J'ai eu une situation où j'avais des entrées superflues dans mon histoire bash d'un Yubikey - peut-être environ 50, correspondant à 'ccccc .....'. Idéalement, je voulais un moyen de supprimer les entrées correspondant à un motif, ce que je suppose que vous pouvez faire avec sed ou quelque chose du genre, en supposant que votre historique ignore les espaces.

Quoi qu'il en soit, je suis devenu paresseux et j'ai fini par utiliser vim, en cherchant 'cccc' et en utilisant 'dd' tout en parcourant chaque match. Ça n'a pas pris plus d'une minute.


1
Si vous faites cela dans vim, vous pouvez aussi faire: g / cccc / d ou: g / ^ cccc / d: ou utilisez une macro qqnddq puis @@ (en supposant que votre dernière recherche portait sur ccccc).
htaccess le

@htaccess Cela aurait certainement été plus facile, mais je voulais en quelque sorte inspecter visuellement le reste du fichier en même temps.
Dylan_Larkin le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.