Como remover uma única linha do histórico?

Respostas:

340

Medidas preventivas

Se você deseja executar um comando sem salvá-lo no histórico, acrescente um espaço extra

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

Para que isso funcione, você precisa ignorespaceou ignorebothentra HISTCONTROL. Por exemplo, execute

HISTCONTROL=ignorespace

Para tornar essa configuração persistente, coloque-a no seu .bashrc.

Limpeza post mortem

Se você já executou o comando e deseja removê-lo do histórico, use primeiro

history

para exibir a lista de comandos em seu histórico. Encontre o número ao lado do que você deseja excluir (por exemplo, 1234) e execute

history -d 1234

Além disso, se a linha que você deseja excluir já tiver sido gravada em seu $ HISTFILE (o que normalmente acontece quando você encerra uma sessão por padrão), será necessário escrever novamente em $ HISTFILE ou a linha reaparecerá quando você abrir um novo sessão:

history -w
jw013
fonte
Funcionou. Eu acho que precisamos usar o ~ / .bashrc depois de modificá-lo ...
B Seven
3
@ jw013 Defino PROMPT_COMMAND como history -a, nesse caso, já está gravado no arquivo de histórico, em vez de sair na configuração normal. Especificamente: mywiki.wooledge.org/BashFAQ/088
jordanm 22/10/12
5
Após excluir uma única linha, você precisa escrever o histórico atual no seu $ HISTFILE usando history -w. Caso contrário, quando você sair, a linha excluída ainda estará lá!
Felipe Alvarez
1
+1 ao comentário acima; usar history -wafter history -d {num}era exatamente o que eu precisava - que petiscos críticos deveriam ser adicionados à resposta, caso contrário, um usuário pode pensar que uma exclusão temporária do shell atual é realmente permanente.
11136 Michael
1
O @BobStein history -wé necessário para entradas que já foram gravadas no .bash_historyarquivo. Como reproduzir (por exemplo, no CentOS 7 com configuração de estoque): 1. logon 2. comando enter echo foo3. logout 4. logon novamente 5. excluir entrada para echo foo6. logout 7. logon 7. logon novamente: a entrada ainda está lá. Dependendo de como você configura seu histórico do bash, talvez você possa reproduzir esse problema de outras maneiras - ou seja, se você provocar a gravação do histórico antes do logout.
maxschlepzig
53
  1. Para limpar todo o seu histórico, use

    history -c
  2. Para excluir uma única linha, use

    history -d linenumber
soumyaranjan
fonte
6

Eu tenho isso no meu ~/.bashrc, o que faz com que o comando $ forgetexclua o comando anterior do histórico

function forget() {                                                              
   history -d $(expr $(history | tail -n 1 | grep -oP '^ \d+') - 1);              
}
Ryan Haining
fonte
Isso parece um pouco complicado. Não history -d $( history | tail -n 1 | cut -f 1 -d " " )seria mais simples?
Seumasmac
1
history | tail -n1é o historypróprio comando, portanto, a exclusão desse número obtém a entrada errada. No entanto, history -d $( history | awk 'END{print $1-1}' )combina a seleção de linha, seleção de campo e subtração.
dave_thompson_085
Alguma chance de alguém ajudar com portin isso para zshell?
Alex S
6

Você sempre pode editar e remover entradas de ~/.bash_history, útil quando desejar remover uma entrada ou mais de uma entrada

Weslor
fonte
2
Muito provavelmente, essas entradas serão reintroduzidas quando você sair do shell.
L0b0 17/07/2018
5

Se você deseja esquecer toda a sessão do bash, pode killexecutar o processo atual do bash. Como a variável $$mantém o pidshell atual, você pode:

kill -9 $$
Bruno Bronosky
fonte
1

Você precisa escrever as alterações depois de limpar o histórico. E se você não gostaria de ter o comando wipe no histórico, é necessário executar o comando assim:

history -c && history -w && logout

Boa sorte.

user882786
fonte
-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
fonte