Eu gerei vários .bash_history
arquivos alternando entre instantâneos em uma VM. Eu gostaria de recuperar todos esses arquivos em um único .bash_history
arquivo ativo na minha instância em execução no momento.
Os arquivos têm carimbos de data e hora e eu gostaria de preservá-los o máximo possível. No entanto, parece que algumas linhas não têm carimbos de data/hora. Por exemplo:
#1542817796
vi ~/.bash_profile
set +x
cd -
cd w/Edge-Agent/edge-agent-ged/
make
set -x
man make
make -npq
make -npq .DEFAULT
make
make
ack npq /etc
ack npq /usr/share/
set +x
ack npq /usr/share/
sudo vi /usr/share/bash-completion/completions/make
dv
hg diff
vi ~/.bashrc
#1542826064
ls
#1542826066
vi ~/.bashrc
#1542826074
cd ..
#1542826321
Gostaria de ordenar a lista mesclada por carimbo de data/hora porque estava alternando entre os instantâneos e os arquivos intercalados entre si. Se não houver carimbo de data/hora disponível para um comando, podemos inferi-lo a partir do último carimbo de data/hora antes e do primeiro carimbo de data/hora depois.
Usando GNU m4 (que suporta desvios numerados até LONG_MAX ) com alguns adicionais
sed
para preparar a entrada:Uso:
A
m4_chunk
função faz a maior parte do trabalho, pois os blocos separados são "não desviados" em ordem numérica crescente quando todas as entradas terminam. O resto do script é para proteger quaisquer aspas em4_
sequências existentes na entrada de serem interpretadas pelom4
.LQ
eRQ
definições baseadas nas notas de Michael Breen sobre a linguagem macro M4 .Por que não fazer algo como
cat /path/to/one/.bash_history >> /path/to/live/.bash_history
, então, você pode remover entradas duplicadas e, emawk '!seen[$0]++' .bash_history >> .bash_history2
seguida, remover o original e renomear .bash_history2 para .bash_history. No entanto, remover as duplicatas como essa deixará carimbos de data e hora vazios.Isso ajudaria:
Certifique-se de listar TODOS os arquivos de histórico como fluxo de entrada para
awk
.EDIT: Alguns ensaios não satisfatórios e não portáteis para manter a ordem original dos comandos:
.
Por muito tempo procurei uma maneira de mesclar o histórico do bash (com timestamps), e nada parecia aceitável.
Isto é... Mesclar o ".bash_history" no disco com o 'history' do shell na memória. Preservar a ordenação de carimbo de data/hora e ordem de comando dentro desses carimbos de data/hora.
Opcionalmente, removendo comandos únicos (mesmo se multi-linhas), e/ou removendo (limpando) comandos simples e/ou sensíveis, de acordo com as RE's perl definidas. Ajuste para se adequar!
Este é o resultado: https://antofthy.gitlab.io/software/history_merge.bash.txt
O primeiro comando 'perl' no script apenas concatena os arquivos de histórico de entrada. O padrão é
"$HISTFILE" <(history -w /dev/stdout)
mesclar o histórico do disco com o histórico da memória, separando-os em registros com carimbo de data/hora. O segundo 'perl' então faz a mesclagem.Ele salva o resultado em um arquivo temporário que pode substituir opcionalmente o histórico no disco ou o histórico na memória como desejar (o atual faz as duas coisas).
Ajuste para se adequar.
Apreciar