¿Cómo eliminar una sola línea del historial?

Respuestas:

340

Medidas preventivas

Si desea ejecutar un comando sin guardarlo en el historial, agréguelo con un espacio adicional

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

Para que esto funcione es necesario, ya sea ignorespaceo ignorebothen HISTCONTROL. Por ejemplo, ejecutar

HISTCONTROL=ignorespace

Para que esta configuración sea persistente, colóquela en su .bashrc.

Limpieza post mortem

Si ya ha ejecutado el comando y desea eliminarlo del historial, primero use

history

para mostrar la lista de comandos en su historial. Encuentre el número al lado del que desea eliminar (por ejemplo, 1234) y ejecute

history -d 1234

Además, si la línea que desea eliminar ya se ha escrito en su $ HISTFILE (que generalmente ocurre cuando finaliza una sesión de forma predeterminada), deberá volver a escribir en $ HISTFILE, o la línea volverá a aparecer cuando abra un nuevo sesión:

history -w
jw013
fuente
Funcionó. Creo que necesitamos obtener ~ / .bashrc después de modificarlo ...
B Seven
3
@ jw013 Configuré PROMPT_COMMAND en history -a, en ese caso ya está escrito en el archivo de historial, en lugar de salir al salir en configuración normal. Específicamente: mywiki.wooledge.org/BashFAQ/088
jordanm
55
Después de eliminar una sola línea, debe escribir el historial actual en su $ HISTFILE usando history -w. De lo contrario, cuando salga, la línea eliminada seguirá allí.
Felipe Alvarez
1
+1 al comentario anterior; usar history -wafter history -d {num}era exactamente lo que necesitaba: ese tidbit crítico debería agregarse a la respuesta, de lo contrario, un usuario podría pensar que una eliminación temporal del shell actual es realmente permanente.
michael
1
@BobStein history -wes necesario para las entradas que ya se han escrito en el .bash_historyarchivo. Cómo reproducir (p. Ej., En CentOS 7 con configuración de stock): 1. iniciar sesión 2. ingresar el comando echo foo3. cerrar sesión 4. iniciar sesión nuevamente 5. eliminar la entrada para echo foo6. cerrar sesión 7. iniciar sesión nuevamente: la entrada sigue ahí. Dependiendo de cómo configure su historial de bash, tal vez pueda reproducir este problema de otras maneras, es decir, si provoca la escritura del historial antes de cerrar sesión.
maxschlepzig
53
  1. Para borrar todo tu historial, usa

    history -c
  2. Para eliminar una sola línea, use

    history -d linenumber
soumyaranjan
fuente
6

Tengo esto en mi ~/.bashrc, lo que hace que el comando $ forgetelimine el comando anterior del historial

function forget() {                                                              
   history -d $(expr $(history | tail -n 1 | grep -oP '^ \d+') - 1);              
}
Ryan Haining
fuente
Eso parece un poco complicado. ¿No history -d $( history | tail -n 1 | cut -f 1 -d " " )sería más simple?
seumasmac
1
history | tail -n1es el historycomando en sí mismo, por lo que al eliminar ese número se obtiene la entrada incorrecta. Sin embargo, history -d $( history | awk 'END{print $1-1}' )combina la selección de línea, la selección de campo y la resta.
dave_thompson_085
¿Hay alguna posibilidad de que alguien pueda ayudar con portin esto a zshell?
Alex S
6

Siempre puede editar y eliminar entradas de ~/.bash_history, útil cuando desea eliminar una entrada o más de una entrada

Weslor
fuente
2
Lo más probable es que estas entradas se reintroduzcan cuando salga del shell.
l0b0
5

Si desea olvidar toda la sesión bash, puede realizar killel proceso bash actual. Como la variable $$contiene el pidshell actual, puede hacer:

kill -9 $$
Bruno Bronosky
fuente
1

Debe escribir los cambios después de borrar el historial. Y si no desea tener el comando de borrado de historial en su historial, entonces necesita ejecutar el comando así:

history -c && history -w && logout

Buena suerte.

usuario882786
fuente
-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
fuente