Excluir as últimas N linhas do histórico do bash

40

Ao colar acidentalmente um arquivo no shell, ele coloca uma tonelada de entradas absurdas e feias no histórico do bash. Existe uma maneira limpa de remover essas entradas? Obviamente, eu poderia fechar o shell e editar o .bash_historyarquivo manualmente, mas talvez haja algum tipo de API disponível para modificar o histórico do shell atual?

ThiefMaster
fonte

Respostas:

36

Você pode usar o history -d offsetbuiltin para excluir uma linha específica do histórico atual do shell ou history -cpara limpar o histórico inteiro.

Não é realmente prático se você deseja remover um intervalo de linhas, pois leva apenas um deslocamento como argumento, mas você pode agrupá-lo em uma função com um loop.

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

Ligue com rmhist first_line_to_delete last_line_to_delete. (Números de linha de acordo com a saída de history.)

(Use history -wpara forçar uma gravação no arquivo de histórico.)

Esteira
fonte
11
Como o OP solicitou a exclusão das N últimas linhas, esse script deve ser modificado da seguinte maneira: tot_lines=$(history | wc -l)e repita history -d $(( tot_lines - $1 )).
precisa saber é o seguinte
2
Em vez de $(history | wc -l), existe a variável $HISTCMDque pode ser usada.
precisa saber é o seguinte
29

Apenas este liner no prompt de comando ajudará.

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

Onde START_NUM está na posição inicial da entrada no histórico. N é o número de entradas que você pode excluir.

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

user2982704
fonte
3
Eu me pergunto por que isso ainda não é uma função interna. 'history' é uma ferramenta muito antiga.
Petr Gladkikh 01/08/16
serve o propósito muito bem, mas este comando pode ser visto na história :)
Rajeev Akotkar
O askubuntu.com/a/978276/22866 tem uma ótima maneira de excluir o comando "delete from history" da history :-)
HanSooloo 04/07
0

A resposta do usuário2982704 quase funcionou para mim, mas não completamente. Eu tive que fazer uma pequena variação como essa.

Supondo que meu histórico esteja em 1000 e eu quero excluir as últimas 50 entradas

start=1000

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