Eu realmente gosto de usar control+r
para pesquisar recursivamente meu histórico de comandos. Encontrei algumas boas opções que gosto de usar:
# ignore duplicate commands, ignore commands starting with a space
export HISTCONTROL=erasedups:ignorespace
# keep the last 5000 entries
export HISTSIZE=5000
# append to the history instead of overwriting (good for multiple connections)
shopt -s histappend
O único problema para mim é que erasedups
apenas apaga duplicatas sequenciais - de modo que, com esta sequência de comandos:
ls
cd ~
ls
O ls
comando será realmente gravado duas vezes. Eu pensei em executar periodicamente w / cron:
cat .bash_history | sort | uniq > temp.txt
mv temp.txt .bash_history
Isso conseguiria remover as duplicatas, mas infelizmente o pedido não seria preservado. Se eu não fizer sort
o arquivo primeiro, não acredito que uniq
possa funcionar corretamente.
Como posso remover duplicatas no meu .bash_history, preservando a ordem?
Crédito extra:
Há algum problema com a substituição do .bash_history
arquivo por um script? Por exemplo, se você remover um arquivo de log do apache, acho que você precisará enviar um sinal de nohup / reset kill
para que ele libere sua conexão com o arquivo. Se esse for o caso do .bash_history
arquivo, talvez eu possa usar de alguma forma ps
para verificar e garantir que não haja sessões conectadas antes da execução do script de filtragem?
ignoredups
vez deerasedups
por um tempo e veja como isso funciona para você.history
comando. Onde eu deveria estar olhando?Respostas:
Classificando o histórico
Este comando funciona como
sort|uniq
, mas mantém as linhas no lugarBasicamente, acrescenta a cada linha seu número. Após a
sort|uniq
introdução, todas as linhas são ordenadas de volta de acordo com a ordem original (usando o campo número da linha) e o campo número da linha é removido das linhas.Essa solução tem a falha de que é indefinido qual representante de uma classe de linhas iguais o fará na saída e, portanto, sua posição na saída final é indefinida. No entanto, se o representante mais recente for escolhido, você poderá
sort
inserir uma segunda tecla:Gerenciando .bash_history
Para reler e escrever de volta o histórico, você pode usar
history -a
ehistory -w
respectivamente.fonte
sort
, a-r
opção sempre reverte a ordem de classificação. Mas isso não produzirá o resultado que você tem em mente.sort
considera as duas ocorrênciasls
idênticas ao resultado que, mesmo quando revertido, a ordem final depende do algoritmo de classificação. Mas veja minha atualização para outra ideia.nl
no início de cada linha de código? Não deveria serhistory
?Então, eu estava procurando exatamente a mesma coisa depois de me incomodar com duplicatas, e descobri que se eu editar meu ~ / .bash_profile (Mac) com:
Ele faz exatamente o que você queria, apenas mantém o mais recente de qualquer comando.
ignoreboth
é realmente como fazerignorespace:ignoredups
e, junto comerasedups
o trabalho, é feito.Pelo menos no meu terminal Mac com bash, este trabalho é perfeito. Encontrei aqui no askubuntu.com .
fonte
Encontrou esta solução na natureza e testada:
A primeira vez que um valor específico de uma linha ($ 0) é visto, o valor de x [$ 0] é zero.
O valor de zero é invertido
!
e se torna um.Uma declaração que é avaliada como uma causa a ação padrão, que é impressa.
Portanto, a primeira vez que um específico
$0
é visto, ele é impresso.Toda vez que a repetição
x[$0]
for incrementada,o valor negado será zero e uma declaração avaliada como zero não será impressa.
Para manter o último valor repetido, inverta o histórico e use o mesmo awk:
fonte
Estendendo a resposta de Clayton:
tac
inverta o arquivo, verifique se você instaloumoreutils
para tersponge
disponibilidade, caso contrário, use um arquivo temporário.fonte
brew install coreutils
e observe que todos os utilitários do GNU têm umg
anexo para evitar confusão com os comandos do BSD para o Mac (por exemplo, gsed é GNU enquanto sed é BSD). Então usegtac
.Eles manteriam as últimas linhas duplicadas:
fonte
Esta é uma publicação antiga, mas um problema permanente para usuários que desejam ter vários terminais abertos e ter o histórico sincronizado entre janelas, mas não duplicado.
Minha solução em .bashrc:
history -n
lê todas as linhas de $ HISTFILE que podem ter ocorrido em um terminal diferente desde o último retorno de carrohistory -w
grava o buffer atualizado em $ HISTFILEhistory -c
limpa o buffer para que não ocorra duplicaçãohistory -r
relê o $ HISTFILE, anexando ao buffer agora em brancotac
reverte-o e depois reverte-o para que possa ser salvo com os comandos mais recentes ainda mais recentes da históriaToda vez que você abre um novo shell, todo o histórico é apagado e toda vez que você pressiona a Entertecla em uma janela diferente do terminal / shell, ele atualiza esse histórico a partir do arquivo.
fonte
Registrar uniqely todos os novos comandos é complicado. Primeiro você precisa adicionar
~/.profile
ou similar:Então você precisa adicionar a
~/.bash_logout
:fonte