Comment supprimer des commands dans l'histoire correspondant à une string donnée?

J'ai besoin de supprimer toutes les commands de mon histoire correspondant à une string. J'ai essayé:

$ history | grep searchssortingng | cut -d" " -f2 | history -d -bash: history: -d: option requires an argument $ history | grep searchssortingng | cut -d" " -f2 | xargs history -d xargs: history: No such file or directory $ temparg() { while read i; do "$@" "$i"; done } $ history | grep searchssortingng | cut -d" " -f2 | temparg history -d (no error, but nothing is deleted) 

Quelle est la bonne façon de le faire?

La command history fonctionne uniquement sur votre file d'historique, $HISTFILE (généralement ~/.history ou ~/.bash_history ). Ce sera beaucoup plus facile si vous supprimez simplement les lignes de ce file, ce qui peut être fait de plusieurs façons. grep est un moyen, mais vous devez faire attention à ne pas écraser le file en le lisant encore:

 $ grep -v searchssortingng "$HISTFILE" > /tmp/history $ mv /tmp/history "$HISTFILE" 

Une autre façon est avec sed :

 $ sed -i '/searchssortingng/d' "$HISTFILE" 

La réponse de Michael Mrozek fonctionnera si vous ne vous souciez pas de supprimer des commands de la session en cours. Si vous le faites, vous devriez écrire au file d'historique avant de faire les opérations dans son post en faisant l' history -a .

En outre, après avoir supprimé les inputs de votre file d'historique, vous pouvez le recharger en émettant l' history -c , puis l' history -r .

Basé sur les réponses de Michael et Chris , je suis venu avec ce qui suit. Ajoutez-le à votre file ~/.bashrc , puis chargez-le . ~/.bashrc . ~/.bashrc ou source ~/.bashrc .

 :<<COMMENT Deletes all lines from the history that match a search ssortingng, with a prompt. The history file is then reloaded into memory. Examples hxf "rm -rf" hxf ^source See: - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-ssortingng COMMENT #The unalias prevents odd errors when calling". ~/.bashrc" (May result in #"not found" errors. That's okay). unalias hxf hxf() { read -r -p "About to delete all items from history that match \"$1\". Are you sure? [y/N] " response response=${response,,} # tolower if [[ $response =~ ^(yes|y)$ ]] then #Delete all matched items from the file, and duplicate it to a temp #location. echo -e "grep -v \"$1\" \"$HISTFILE\" > /tmp/history" grep -v "$1" "$HISTFILE" > /tmp/history #Clear all items in the current sessions history (in memory). This #empties out $HISTFILE. echo "history -c" history -c #Overwrite the actual history file with the temp one. echo -e "mv /tmp/history \"$HISTFILE\"" mv /tmp/history "$HISTFILE" #Now reload it. echo -e "history -r \"$HISTFILE\"" history -r "$HISTFILE" #Alternative: exec bash else echo "Cancelled." fi } 

Pour ceux qui searchnt un one-liner:

 while history -d $(history | grep 'SEARCH_STRING_GOES_HERE'| head -n 1 | awk {'print $1'}) ; do :; history -w; done 

Donc, si vous vouliez par exemple. supprimer plusieurs lignes avec un mot de passe, il suffit de replace "SEARCH_STRING_GOES_HERE" par le mot de passe. Ceci searchra toute votre histoire pour cette string de search et la supprimera.

2 choses à savoir

  • grep utilise regex sauf si vous fournissez -F comme argument
  • La command affichera 1 erreur, une fois qu'il n'y a plus de correspondance. Ignorez-le.