Necesito eliminar todos los comandos en mi historial que coinciden con una cadena. He intentado:
$ history | grep searchstring | cut -d" " -f2 | history -d
-bash: history: -d: option requires an argument
$ history | grep searchstring | cut -d" " -f2 | xargs history -d
xargs: history: No such file or directory
$ temparg() { while read i; do "$@" "$i"; done }
$ history | grep searchstring | cut -d" " -f2 | temparg history -d
(no error, but nothing is deleted)
¿Cuál es la forma correcta de hacer esto?
                    
                        bash
                                text-processing
                                command-history
                                xargs
                                
                    
                    
                        linuxfix
fuente
                
                fuente

history -d X. Encontré esta pregunta porque acababa de hacerlohistory | grep search_str | sort -nr | awk '{print $1}' | while read i; do history -d $i; done. Sin error, pero nada eliminado. ¿Alguien puede explicar por qué?Respuestas:
El
historycomando solo opera en su archivo de historial,$HISTFILE(típicamente~/.historyo~/.bash_history). Será mucho más fácil si solo elimina las líneas de ese archivo, lo que se puede hacer de muchas maneras.grepes una forma, pero debe tener cuidado de no sobrescribir el archivo mientras lo sigue leyendo:Otra forma es con
sed:fuente
$HISTFILEpodría contener espacios, probablemente valga la pena citarlo.La respuesta de Michael Mrozek funcionará si no te importa eliminar comandos de la sesión actual. Si lo hace, debe escribir en el archivo de historial antes de realizar las operaciones en su publicación haciendo
history -a.Además, después de haber eliminado las entradas que desea de su archivo de historial, puede volver a cargarlo emitiendo
history -c, luegohistory -r.fuente
Basado en las respuestas de Michael y Chris , se me ocurrió lo siguiente. Agréguelo a su
~/.bashrcarchivo y luego cárguelo con. ~/.bashrcosource ~/.bashrc.fuente
Para aquellos que buscan una línea:
Entonces, si quisieras, por ejemplo. elimine varias líneas con una contraseña, simplemente reemplace "SEARCH_STRING_GOES_HERE" con la contraseña. Esto buscará en todo tu historial esa cadena de búsqueda y la eliminará.
2 cosas a tener en cuenta
fuente
Esto funcionó para mí. history -c && history -a no volvió a cargar el archivo de historial correctamente para mí. Entonces, en cambio, salgo de mi sesión justo después de reescribir el archivo de historial para que el que está en la memoria no lo sobrescriba.
fuente