Eliminar las últimas N líneas del historial de bash

40

Al pegar accidentalmente un archivo en el shell, pone un montón de entradas feas sin sentido en el historial de bash. ¿Hay una manera limpia de eliminar esas entradas? Obviamente, podría cerrar el shell y editar el .bash_historyarchivo manualmente, pero ¿tal vez hay algún tipo de API disponible para modificar el historial del shell actual?

ThiefMaster
fuente

Respuestas:

36

Puede usar la función history -d offsetincorporada para eliminar una línea específica del historial del shell actual o history -cpara borrar todo el historial.

No es realmente práctico si desea eliminar un rango de líneas, ya que solo toma un desplazamiento como argumento, pero podría envolverlo en una función con un bucle.

rmhist() {
    start=$1
    end=$2
    count=$(( end - start ))
    while [ $count -ge 0 ] ; do
        history -d $start
        ((count--))
    done
}

Llámalo con rmhist first_line_to_delete last_line_to_delete. (Números de línea según la salida de history.)

(Use history -wpara forzar una escritura en el archivo de historial).

Estera
fuente
1
Dado que el OP solicitó eliminar las N últimas líneas, este script debe modificarse haciendo algo como: tot_lines=$(history | wc -l)y luego repetir history -d $(( tot_lines - $1 )).
PlasmaBinturong
2
En lugar de $(history | wc -l), existe la variable $HISTCMDque se puede utilizar.
PlasmaBinturong
29

Solo este trazador de líneas en el símbolo del sistema ayudará.

for i in {1..N}; do history -d START_NUM; done

Donde START_NUM es la posición inicial de entrada en el historial. N es el número de entradas que puede querer eliminar.

ex: for i in {1..50}; do history -d 1030; done

usuario2982704
fuente
3
Me pregunto por qué esta no es una función integrada ya. La "historia" es una herramienta muy antigua.
Petr Gladkikh
cumple muy bien el propósito, pero este comando se puede ver en la historia :)
Rajeev Akotkar
askubuntu.com/a/978276/22866 tiene una buena manera de eliminar el "comando eliminar del historial" del historial :-)
HanSooloo
0

La respuesta del usuario 2982704 casi funcionó para mí, pero no del todo. Tuve que hacer una pequeña variación como esta.

Suponiendo que mi historial está en 1000 y quiero eliminar las últimas 50 entradas

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
Aberpaul
fuente