¿Cómo eliminar los resultados seleccionados del historial de bash?

66

historyEl comando muestra todos los resultados, pero podemos filtrar para obtener un comando particular usando history | grep searchingCommand. Es realmente útil

Pero el problema es que muestra esos comandos que también se ingresaron con un error tipográfico o que no tuvieron éxito. Entonces identificar el correcto es realmente un dolor. Revisé este enlace: ¿ Historial de comandos selectivo en la terminal? Pero esa no era mi solución.

Entonces, ¿hay alguna forma de eliminar esos comandos del historial que eran incorrectos en el momento ingresado o más tarde?

Saurav Kumar
fuente
55
Por favor, cambie la respuesta aceptada, hay otras con más de 100 votos.
greuze
1
@greuze: cambiado a la mejor respuesta. ¡El conteo de votos no significa que sea el mejor!
Saurav Kumar

Respuestas:

20

Me gustaría agregar otro método para modificar (o eliminar) las entradas del historial, que encontré accidentalmente cuando estaba trabajando con el bash:

Para demostrar esto, comience ejecutando los siguientes tres comandos en bash:

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

Ahora puede seleccionar estos comandos nuevamente con las teclas de flecha o Ctrl+ py Ctrl+ n.

Digamos que desea modificar los dos primeros comandos. Desplácese por el historial hasta que echo 1aparezca y cámbielo a echo 1 - changed, pero NO PRESIONE ENTER. Si ahora avanza más a través de su historial, esta línea permanece en su estado modificado y puede alejarse y volver a ella. Ahora muévase a la línea echo 2y cámbiela a echo 2 - changed, nuevamente, no presione enter. Para guardar los cambios en estas líneas, seleccione cualquier comando en el historial, excepto estos dos, y presione Ctrl+ c.

Por supuesto, en lugar de modificar la entrada del historial, también puede eliminarla, lo que dará como resultado una línea vacía en esa entrada. Para eliminar la línea que se muestra actualmente en el indicador, presione Ctrl+ e(que salta al final de la línea) seguido de Ctrl+ u(que elimina el texto desde el inicio de la línea hasta el cursor).

Consulte también https://unix.stackexchange.com/questions/195668/what-can-cause-an-item-to-be-deleted-from-my-bash-history/195726#195726 para obtener una explicación más detallada de experiencia técnica.

La forma más simple:

  1. ctrl+ rpara buscar el comando que desea eliminar / modificar.
  2. end para seleccionar el comando buscado para eliminar / modificar
  3. Eliminar o modificar el comando seleccionado (no presione entero ctrl+ c)
  4. flecha hacia arriba (o ctrl+ p) o flecha hacia abajo (o ctrl+ n) para seleccionar cualquier otro comando.
  5. ctrl+ ¡ c Eso es!

Nota :

Esto cambia solo los comandos de sesión actuales. Si queremos cambiar los comandos más antiguos y guardar los cambios, debemos ejecutar el siguiente comando antes de cerrar el terminal:

history -w
Stefan Hamcke
fuente
Muchas gracias Stefan! Debo decir que trajiste cosas increíbles. Usando esto, encontré la forma más simple de modificar / eliminar el historial: 1.ctrl+r para buscar el comando que desea eliminar / modificar. 2.end mover el comando y eliminar / modificar el comando. 3.ctrl+n para ir a la siguiente línea y luego 4.ctrl+c
Saurav Kumar
144

Utilizar:

history -d OFFSET

para eliminar la entrada del historial en el desplazamiento OFFSETincluso antes de que se agregue a su archivo de historial bash Para encontrar el derecho OFFSET, solo necesita ejecutar el historycomando. Es el número desde el inicio de la línea que contiene la entrada del historial que desea eliminar.

Y para guardar las modificaciones en el historial use:

history -w

Ver más detalles en esta guía .

user299481
fuente
no está mal :) Es bueno tener una nueva forma ...
Saurav Kumar
10
@SauravKumar ¿No está mal? Probablemente sea la mejor manera ...
Radu Rădeanu
55
LEA PRIMERO: para que quede claro, debe hacer history -wpalabras posteriores para guardar los cambios. También OFFSET significa qué número se historymuestra. Si la línea que intenta eliminar es 873, úsela history -d 873.
Cammy_the_block
2
@ RaduRădeanu Use history -wdespués history -dpara guardar los cambios.
Cammy_the_block
20
Esta debería ser la respuesta correcta.
topher
19

Edite el archivo ~/.bash_historyy elimine una vez con errores tipográficos

Por ejemplo, inserte este comando:

gedit ~/.bash_history

Edite algo que le guste y luego guarde el archivo y reinicie el terminal. El comando raíz es:

sudo -i 
inser your password
gedit ~/.bash_history

si quieres borrar todo history -cdeberías hacer el truco


SINTAXIS

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

LLAVE

-c Borrar la lista del historial. Esto se puede combinar con las otras opciones para reemplazar la lista del historial por completo.

-d offset Eliminar la entrada del historial en el desplazamiento de posición. el desplazamiento debe especificarse tal como aparece cuando se muestra el historial.

-a Agregue las nuevas líneas de historial (líneas de historial ingresadas desde el comienzo de la sesión Bash actual) al archivo de historial.

-n Añade las líneas del historial que aún no se han leído del archivo del historial a la lista del historial actual. Estas son líneas agregadas al archivo de historial desde el comienzo de la sesión Bash actual.

-r Lee el archivo de historial actual y agrega su contenido a la lista de historial.

-w Escribe el historial actual en el archivo de historial.

-p Realiza la sustitución del historial en los argumentos y muestra el resultado en la salida estándar, sin almacenar los resultados en la lista del historial.

-s Los argumentos se agregan al final de la lista del historial como una sola entrada.

fuente :

cuchilla19899
fuente
Gracias es útil! ¿Sabes cómo eliminar la entrada en el momento en que se ingresó desde la línea de comandos? ¿O hay algún comando para eliminar la entrada sin abrir el .bash_history?
Saurav Kumar
1
@ bladed19899 history -cno funciona Cuando cierro el terminal y lo vuelvo a abrir, los historiales no se eliminan. -1 tu respuesta
αғsнιη
1
@KasiyA, -c Clear the history list. This may be combined with the other options to replace the history list completely. fuente
blade19899
2
@KasiyA Use history -wdespués history -cpara escribir los cambios.
Cammy_the_block
16

Si desea eliminarlo inmediatamente desde el mismo terminal, primero debe agregar lo siguiente a su archivo ~ / .bashrc.

PROMPT_COMMAND='history -a' 

y reinicie su terminal.

Puede agregarlo en cualquier parte del archivo .bashrc. He agregado lo siguiente junto con otras cosas relacionadas con el historial.

ingrese la descripción de la imagen aquí

Por lo general, durante una sesión bash, los comandos ejecutados no se escriben en .bash_history hasta que la sesión finaliza, por lo tanto, PROMPT_COMMAND='history -a'ingresa el comando y luego en .bash_history.

Ahora, siempre que cometa un error o error en un comando y desee eliminarlo, ejecute lo siguiente

sed -i '$d' ~/.bash_history

y tada se eliminaría.

Para hacerlo más simple, puede asignarle un alias a algo más simple y usarlo como

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

Por lo tanto, la ejecución rheliminará el último comando ejecutado del historial.

Lo anterior es un alias temporal que solo dura una sesión. Para que sea permanente o persistente, agregue

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

a .bashrc

NOTA

No debe haber espacio en ambos lados de =

Si no quieres alias, entonces también puedes hacer lo siguiente

Haga un nombre commad rhy colóquelo en el /bindirectorio:

  • Abra un archivo, diga rhy pegue el siguiente código, guarde y cierre:

    sed -i '$d' ~/.bash_history

  • Hacer rhejecutable y colocarlo en el /bindirectorio:

     chmod + x rh
     sudo cp rh / bin 
  • Ahora use el rhcomando para eliminar el comando reciente del historial.

Stormvirux
fuente
¿Dónde agregar PROMPT_COMMAND='history -a'en el .bashrcarchivo? ¿Y qué hará exactamente? ¡Intenté sed -i '$d' ~/.bash_historyque funcionara sin editar .bashrc! Pero el alias no funciona ... Aceptaré tu respuesta si elaboras mi pregunta y haces que el alias funcione ... :)
Saurav Kumar
@SauravKumar ha editado la respuesta. Había perdido las comillas simples y dobles en el comando de aliasing. Mi
error
Créanme o no ... el alias todavía no funciona ... Se ejecuta sin ningún error, pero no elimina la entrada del .bash_historyarchivo ...: P de ninguna manera ... No es un problema ... Hice mi propio comando y lo coloqué en /bindirectorio. Debido a su comando: sed -i "$d" ~/.bash_historyestá funcionando bien. Acepto tu respuesta .. :)
Saurav Kumar
Si no le importa, me gustaría editar su respuesta para que sea útil para los demás ...
Saurav Kumar
En realidad lo edité. Tienes que aprobarlo ..
Saurav Kumar
2

para eliminar varias líneas (por ejemplo, de 1974 a 1990, verifique con el historycomando):

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

tenga en cuenta que el número de línea a eliminar es siempre el mismo, ya que lo elimina constantemente y pasa al siguiente.

törzsmókus
fuente
La nota es muy importante.
Weijun Zhou
1

Si está utilizando la opción "set -o vi" en bash (muy útil para buscar con la tecla Escape), puede buscar la línea y eliminar la línea con "dd" de la misma manera que lo hace en "vi".

El chico de TI
fuente
Me parece que tengo que escribir jo kdespués ddpara que realmente borre el comando del historial. Si escribo otro comando, o simplemente presiono Enter, bash parece suponer que es solo un comando nuevo y que debería retener el comando anterior en la historia. También es interesante observar que cuando se hace correctamente, borra el comando, pero no lo elimina; el resultado son entradas de historial en blanco. Pero esto es lo suficientemente bueno para eliminar las contraseñas que me obligaron a escribir en la línea de comandos, y es mucho más fácil que otras respuestas, así que muchas gracias por publicar esto.
Michael Scheper el
0

Tuve una situación en la que tuve entradas superfluas en mi historial de bash de un Yubikey, tal vez 50 más o menos, que coinciden con 'ccccc .....'. Idealmente, quería una forma de eliminar entradas que coincidan con un patrón, lo que supongo que podría hacer con sed o algo así, suponiendo que su historial ignore los espacios en blanco.

De todos modos, me volví perezoso y terminé usando vim, buscando 'cccc' y usando 'dd' mientras recorría cada partido. No tomó más de un minuto.

Dylan_Larkin
fuente
1
Si está haciendo esto en vim, entonces también podría hacer: g / cccc / d o: g / ^ cccc / d: o usar una macro qqnddq luego @@ (se supone que su última búsqueda fue para ccccc).
htaccess
@htaccess Eso ciertamente habría sido más fácil, pero quería inspeccionar visualmente el resto del archivo al mismo tiempo.
Dylan_Larkin