Os comandos a seguir
511 clear
512 history
513 history -d 505
514 history
515 history -d 507 510 513
516 history
517 history -d 509
518 history
519 history -d 511
520 history
Posso excluir um por history -d 511
, mas como excluir os últimos 10 comandos e entre os 10 comandos do histórico usando o comando único no shell?
Podemos escrever um script bash e executar para excluir o histórico?
vi $HISTFILE
e exclua o que quiser. Usehead -n -10
se você tiver que automatizá-lo.Respostas:
Você já tentou editar o arquivo de histórico diretamente:
fonte
~/.viminfo
portanto, remova-o também!.bash_history
podem ser substituídas pelo que é mantido na memória. Eu encontrei esta solução útil: superuser.com/a/384383/253543Minha resposta é baseada em respostas anteriores, mas com a adição de reverter a sequência para que os itens do histórico sejam excluídos da mais recente para a menos recente.
Obtenha seu histórico atual (ajuste o número de linhas que deseja ver):
Isso me dá algo como
Selecione as posições inicial e final dos itens que você deseja excluir. Vou excluir as entradas 1006 a 1008.
Isso gerará
history -d
comandos para 1006, depois 1007 se tornará 1006 e 1006 será excluído, depois 1008 (se tornará 1007) agora será 1006 e será excluído.Se eu também quis excluir o comando delete de histórico, é um pouco mais complicado, porque você precisa conhecer a entrada atual máxima do histórico.
Você pode obter isso com (pode haver uma maneira melhor):
Juntando-o, você pode usá-lo para excluir um intervalo e também excluir o comando de exclusão do histórico:
Agrupe tudo isso em uma função para adicionar ao seu
~/.bashrc
:Exemplo excluindo os comandos 4, 5 e 6 (1049-1051) e ocultando a evidência:
A questão era, na verdade, excluir os 10 últimos comandos do histórico; portanto, se você quiser economizar um pouco de esforço, poderá usar outra função para chamar a
histdel
função que faz os cálculos para você.Esta função requer 1 argumento, o número de itens do histórico anterior a serem excluídos. Então, para excluir os últimos 10 comandos do histórico, basta usar
histdeln 10
.fonte
history | tail -1 | awk '{print $1}'
pode ser simplificado parahistory 1 | awk '{print $1}'
-bash: tac: command not found
no Mac OSX, caso contrário, essa seria a melhor resposta.for h in $(seq 1006 1008); do history -d 1006; done
isso funciona no ubuntu 16.04for i in {1..10}; do history -d $(($HISTCMD-11)); done
fonte
history -d 511
funciona conforme o esperado,history -d 512
exclui o que costumava ser 513 e 512 permanece no histórico como comando 511. Espero que faça sentido .$x
todas as vezes no loop, estou excluindo$1
. Portanto, ele primeiro exclui 511 e 512 se torna 511. Em seguida, exclui 511 novamente e assim por diante.for i in
...history -d $i
e obtive os resultados que descrevi no meu comentário acima. Usando $ 1, isso está absolutamente correto, conforme indicado na sua resposta original.Primeiro, digite:
history
e anote a sequência dos números de linha que você deseja remover.Para limpar as linhas de, digamos, da linha 1800 a 1815, escreva o seguinte no terminal:
Se você deseja excluir o histórico do comando de exclusão, adicione +1 para 1815 = 1816 e o histórico dessa sequência + o comando de exclusão será excluído.
Por exemplo :
fonte
$line
exclui todas as outras linhas e depois excede o intervalo desejado.Com o Bash 5, agora você pode fazer uma série ... Viva !:
ou contando para trás 10:
Trecho do Bash 5 Man Page :
Aqui está minha solução para o Bash 4. Exclui iterativamente uma única entrada ou um intervalo do histórico começando com o índice mais baixo.
fonte
Combinando respostas acima:
history -w vi ~/.bash_history history -r
fonte
editar:
Mudou os iteradores apoiados, boa chamada. Além disso, chame esta função com um iterador reverso.
Você provavelmente pode fazer algo assim:
Onde você evocará assim:
Observe que não coloquei nenhum erro ao fazer o check-in nos limites. Vou deixar isso como um exercício para o leitor.
veja também esta pergunta
fonte
seq 563 514
não imprimirá nada. Você precisaseq 563 -1 514
. Como alternativa, você pode simplesmente usar oshistory -d $1
argumentos como514 563
Talvez seja útil para alguém.
Quando você efetua login em qualquer usuário de qualquer histórico de console / terminal da sua sessão atual, existe apenas em algum "buffer" que é direcionado para ~ / .bash_history no seu logout.
Portanto, para manter as coisas em segredo, você pode apenas:
history -r && exit
e você será desconectado com todo o histórico da sua sessão (e somente) limpo;)
fonte
Usei uma combinação de soluções compartilhadas neste segmento para apagar o rastreamento no histórico de comandos. Primeiro, verifiquei onde é salvo o histórico de comandos com:
Editei a história com:
Depois disso, libero o buffer do histórico da sessão atual com:
Na próxima vez que você entrar nesta sessão, o último comando que você verá no histórico de comandos será o último que você deixou no pathToFile .
fonte
história -c limpará todas as histórias.
fonte
para excluir as últimas 10 entradas (com base no seu exemplo):
fonte
Eu uso esse script para excluir os últimos 10 comandos no histórico:
Ele usa
$HISTCMD
environment var para obter o índice do histórico e o usa para excluir as últimas 10 entradashistory
.fonte
Tente o seguinte:
fonte
for i in {511..520}; do history -d $i; echo "history -d 511"; done
Eu uso isso (tenho bash 4):
As
builtin history
partes, assim como a última,-w
é porque eu tenho uma variação dos famosos truques para compartilhar a história entre os terminais e essa função seria interrompida sem essas partes. Eles garantem uma chamada para o bash real incorporadohistory
(e não para o meu próprio wrapper em torno dele) e escrevem o histórico para HISTFILE logo após as entradas serem removidas.No entanto, isso funcionará como nas configurações de histórico "normal".
Você deve chamá-lo com o número de últimas entradas que deseja remover, por exemplo:
Irá remover as últimas 10 entradas.
fonte
Bruto, mas funcional
fonte
Se você deseja excluir 10 linhas, basta alterar o valor de N para 10.
fonte
Uma função simples pode matar todos por número (embora vomite em erros)
fonte
Curto, mas doce:
for i in {1..10}; do history -d $(($HISTCMD-11)); done
fonte