Como excluir resultados selecionados do histórico do bash?

66

historyO comando mostra todos os resultados, mas podemos filtrar para obter um comando específico usando history | grep searchingCommand. É realmente útil.

Mas o problema é que também mostra esses comandos que foram inseridos com erro de digitação ou que não tiveram êxito. Então, identificar o correto é realmente uma dor. Eu verifiquei este link: Histórico de comando seletivo no terminal? mas essa não foi a minha solução.

Portanto, existe uma maneira de excluir esses comandos do histórico que estavam incorretos no momento digitado ou posteriormente?

Saurav Kumar
fonte
5
Por favor, altere a resposta aceita, existem outras com mais de 100 votos a favor.
greuze
11
@ greuze: Mudou para a melhor resposta. A contagem de votos não significa que é o melhor!
Saurav Kumar

Respostas:

20

Gostaria de adicionar outro método para modificar (ou excluir) as entradas do histórico, que achei acidentalmente quando estava trabalhando com o bash:

Para demonstrar isso, comece executando os três comandos a seguir no bash:

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

Agora você pode selecionar esses comandos novamente usando as teclas de seta ou Ctrl+ pe Ctrl+ n.

Digamos que você queira modificar os dois primeiros comandos. Mova-se pelo histórico até echo 1aparecer e altere-o para echo 1 - changed, mas NÃO PRESSIONE ENTER. Se você agora avançar no seu histórico, essa linha permanecerá em seu estado modificado e você poderá se afastar e voltar a ela. Agora vá para a linha echo 2e mude para echo 2 - changed, novamente, não pressione enter. Para salvar as alterações nessas linhas, selecione qualquer comando no histórico, exceto os dois, e pressione Ctrl+ c.

Obviamente, em vez de modificar a entrada do histórico, você também pode removê-la, o que resultará em uma linha vazia nessa entrada. Para excluir a linha atualmente exibida no prompt, pressione Ctrl+ e(que pula para o final da linha) seguido de Ctrl+ u(que exclui o texto do início da linha para o cursor).

Consulte também https://unix.stackexchange.com/questions/195668/what-can-cause-an-item-to-be-deleted-from-my-bash-history/195726#195726 para obter uma explicação mais detalhada sobre o formação técnica.

Maneira mais simples:

  1. ctrl+ rpara pesquisar o comando que você deseja excluir / modificar.
  2. end para selecionar o comando pesquisado para excluir / modificar
  3. Exclua ou modifique o comando selecionado (não pressione enterou ctrl+ c)
  4. seta para cima (ou ctrl+ p) ou seta para baixo (ou ctrl+ n) para selecionar qualquer outro comando.
  5. ctrl+ c É isso aí!

Nota :

Isso altera apenas os comandos da sessão atual. Se queremos alterar comandos antigos e salvar as alterações, precisamos executar o seguinte comando antes de fechar o terminal:

history -w
Stefan Hamcke
fonte
Muito obrigado Stefan! Devo dizer que você trouxe coisas impressionantes. Usando isso, achei a maneira mais simples de modificar / excluir o histórico: 1.ctrl+r para pesquisar o comando que você deseja excluir / modificar. 2.end para mover o comando e excluir / modificar o comando. 3.ctrl+n para ir para a próxima linha e, em seguida, 4.ctrl+c
Saurav Kumar
144

Usar:

history -d OFFSET

para excluir a entrada do histórico no deslocamento OFFSETantes mesmo de ser adicionada ao arquivo de histórico do bash. Para descobrir o que é certo OFFSET, você precisa apenas executar o historycomando. É o número desde o início da linha que contém a entrada do histórico que você deseja excluí-la.

E para salvar as modificações no histórico, use:

history -w

Veja mais detalhes neste guia .

user299481
fonte
não é mau :) Boa para obter um novo caminho ..
Saurav Kumar
10
@SauravKumar Não é ruim?!? Provavelmente é a melhor maneira ...
Radu Rădeanu
5
LEIA PRIMEIRO: Para ficar claro, você deve fazer o history -wpós-processamento para salvar as alterações. OFFSET também significa qual número é historyexibido. Se a linha que você está tentando excluir for 873, use history -d 873.
Cammy_the_block
2
@ RaduRădeanu Use history -wdepois history -dpara salvar as alterações.
Cammy_the_block
20
Essa deve ser a resposta correta.
topher
19

Edite o arquivo ~/.bash_historye exclua uma vez com erros de digitação

Por exemplo, insira este comando:

gedit ~/.bash_history

Edite o que quiser e depois salve o arquivo e reinicie o terminal. O comando raiz é:

sudo -i 
inser your password
gedit ~/.bash_history

se você deseja excluir todos history -cdevem fazer o truque


SINTAXE

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

CHAVE

-c Limpa a lista do histórico. Isso pode ser combinado com as outras opções para substituir completamente a lista do histórico.

-d deslocamento Exclui a entrada do histórico no deslocamento da posição. O deslocamento deve ser especificado como aparece quando o histórico é exibido.

-a Anexe as novas linhas do histórico (linhas do histórico inseridas desde o início da sessão atual do Bash) ao arquivo do histórico.

-n Anexe as linhas do histórico ainda não lidas do arquivo de histórico à lista de histórico atual. Essas são linhas anexadas ao arquivo de histórico desde o início da sessão atual do Bash.

-r Leia o arquivo de histórico atual e anexe seu conteúdo à lista de históricos.

-w Escreva o histórico atual no arquivo de histórico.

-p Execute a substituição do histórico nos argumentos e exiba o resultado na saída padrão, sem armazenar os resultados na lista do histórico.

-s Os argumentos são adicionados ao final da lista do histórico como uma única entrada.

fonte :

blade19899
fonte
Obrigado, é útil! Você sabe como excluir a entrada no momento em que foi inserida na linha de comando? Ou existe algum comando para excluir a entrada sem abrir o .bash_history?
Saurav Kumar
11
@ bladed19899 history -cnão funciona Quando eu fecho o terminal e o abro novamente, os históricos não são excluídos. -1 sua resposta
αғsнιη
11
@KasiyA, -c Clear the history list. This may be combined with the other options to replace the history list completely. source
blade19899
2
@KasiyA Use history -wdepois history -cpara escrever as alterações.
Cammy_the_block
16

Se você deseja excluí-lo imediatamente do primeiro terminal, adicione o seguinte ao seu arquivo ~ / .bashrc.

PROMPT_COMMAND='history -a' 

e reinicie o seu terminal.

Você pode adicioná-lo em qualquer lugar do arquivo .bashrc. Adicionei como abaixo, juntamente com outras coisas relacionadas ao histórico.

insira a descrição da imagem aqui

Normalmente, durante uma sessão bash, os comandos executados não são gravados em .bash_history até que a sessão seja encerrada; portanto, ele PROMPT_COMMAND='history -a'entra e depois no comando .bash_history.

Agora, sempre que você cometer um erro ou erro em um comando e quiser excluí-lo, basta executar o seguinte

sed -i '$d' ~/.bash_history

e tada seria deletado.

Para simplificá-lo, você pode aliasá-lo para algo mais simples e usá-lo como

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

Portanto, a execução rhremoverá o último comando executado do histórico.

O acima é um alias temporário que dura apenas uma sessão. Para torná-lo permanente ou persistente, adicione

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

para .bashrc

NOTA

Não deve haver espaço nos dois lados da =

Se você não quiser o alias, também poderá fazer o seguinte

Crie um nome de commad rhe coloque-o no /bindiretório:

  • Abra um arquivo diga rhe cole o seguinte código, salve e feche:

    sed -i '$d' ~/.bash_history

  • Torne rhexecutável e coloque-o no /bindiretório:

     chmod + x rh
     sudo cp rh / bin 
  • Agora use o rhcomando para excluir o comando recente do histórico.

Stormvirux
fonte
Onde adicionar PROMPT_COMMAND='history -a'no .bashrcarquivo? E o que exatamente isso fará? Eu tentei sed -i '$d' ~/.bash_historyfuncionar sem edição .bashrc!! Mas a coisa alias não está funcionando .. Vou aceitar a sua resposta se você acabou de elaborar a minha pergunta e fazer apelido de trabalho .. :)
Saurav Kumar
@SauravKumar editou a resposta. Tinha perdido as aspas simples e duplas no comando alias .. Meu ruim ..: P
Stormvirux
Acredite em mim ou não .. alias coisa ainda não está funcionando .. Ele executa sem nenhum erro, mas não exclui a entrada do .bash_historyarquivo ..: P de qualquer maneira .. Não é um problema .. Eu fiz meu próprio comando e coloquei-o no /bindiretório. Desde por causa do seu comando: sed -i "$d" ~/.bash_historyestá funcionando bem. Eu aceito a sua resposta .. :)
Saurav Kumar
Se você não se importa, eu gostaria de editar a sua resposta de forma que seria útil para outras pessoas ..
Saurav Kumar
Na verdade, eu editei. Você tem que aprová-lo ..
Saurav Kumar
2

para remover várias linhas (por exemplo, de 1974 a 1990, verifique com o historycomando):

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

observe que o número da linha a remover é sempre o mesmo, pois você o remove constantemente e passa para o próximo.

törzsmókus
fonte
A nota é muito importante.
Weijun Zhou
1

Se você estiver usando a opção "set -o vi" no bash (muito útil para pesquisar novamente com a tecla Escape), poderá procurar a linha e excluir a linha com "dd" da mesma forma que em "vi".

The IT Guy
fonte
Acho que tenho que digitar jou kdepois ddpara torná-lo realmente claro o comando do histórico. Se eu digitar outro comando, ou apenas pressionar Enter, o bash parece assumir que é apenas um novo comando e que ele deve manter o comando antigo no histórico. Também é interessante observar que, quando feito corretamente, limpa o comando, mas não o exclui - o resultado são entradas do histórico em branco. Mas isso é bom o suficiente para remover senhas que eu fui forçado a digitar na linha de comando e muito mais fácil do que outras respostas, então muito obrigado por postar isso!
Michael Scheper 12/01
0

Eu tive uma situação em que tinha entradas supérfluas na minha história do bash de um Yubikey - talvez 50 ou mais, combinando 'ccccc .....'. Idealmente, eu queria uma maneira de excluir entradas correspondentes a um padrão, o que suponho que você poderia fazer com sed ou algo assim, supondo que seu histórico ignore espaços em branco.

Enfim, fiquei preguiçoso e acabei usando o vim, procurando por 'cccc' e usando 'dd' enquanto andava de bicicleta em todas as partidas. Não demorou mais que um minuto.

Dylan_Larkin
fonte
11
Se você estiver fazendo isso no vim, também poderá: g / cccc / d ou: g / ^ cccc / d: ou usar uma macro qqnddq e @@ (assume que sua última pesquisa foi por ccccc).
htaccess 12/01
@htaccess Isso certamente teria sido mais fácil, mas eu meio que queria inspecionar visualmente o restante do arquivo ao mesmo tempo.
Dylan_Larkin 24/01