AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 486022
Accepted
Stephen Rasku
Stephen Rasku
Asked: 2018-12-05 15:11:57 +0800 CST2018-12-05 15:11:57 +0800 CST 2018-12-05 15:11:57 +0800 CST

Mesclar vários arquivos .bash_history com timestamps

  • 772

Eu gerei vários .bash_historyarquivos alternando entre instantâneos em uma VM. Eu gostaria de recuperar todos esses arquivos em um único .bash_historyarquivo 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.

bash command-history
  • 4 4 respostas
  • 682 Views

4 respostas

  • Voted
  1. Best Answer
    JigglyNaga
    2018-12-06T06:32:18+08:002018-12-06T06:32:18+08:00

    Usando GNU m4 (que suporta desvios numerados até LONG_MAX ) com alguns adicionais sedpara preparar a entrada:

    #!/bin/sh
    
    { cat <<"EOF"
    m4_define(m4_chunk,`m4_divert(-1)m4_undivert($1)m4_divert($1)#$1')m4_dnl
    m4_define(m4_,``m4_'')m4_dnl
    m4_define(`m4_LQ',`m4_changequote([,])`m4_dnl'
    m4_changequote`'')m4_dnl
    m4_define(`m4_RQ',`m4_changequote([,])m4_dnl`
    'm4_changequote`'')m4_dnl
    EOF
    sed -e "s/m4_/m4_()/g;s/\`/m4_LQ()/g;s/'/m4_RQ()/g;s/m4_/\`'m4_/g" -e 's/^#\([0-9]\+\)$/m4_chunk(\1)/'
    } | m4 -P
    

    Uso:

    cat edgeos_history.* | sort_history.sh > merged_history
    

    A m4_chunkfunçã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 e m4_sequências existentes na entrada de serem interpretadas pelo m4.

    LQe RQdefinições baseadas nas notas de Michael Breen sobre a linguagem macro M4 .

    • 1
  2. Michael Prokopec
    2018-12-05T15:28:18+08:002018-12-05T15:28:18+08:00

    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, em awk '!seen[$0]++' .bash_history >> .bash_history2seguida, remover o original e renomear .bash_history2 para .bash_history. No entanto, remover as duplicatas como essa deixará carimbos de data e hora vazios.

    • 0
  3. RudiC
    2018-12-06T06:17:11+08:002018-12-06T06:17:11+08:00

    Isso ajudaria:

    awk '/^#[0-9]*$/ {TS = $0; next} {print TS, $0}' file* | sort
    #1542817796 ack npq /etc
    #1542817796 ack npq /usr/share/
    #1542817796 ack npq /usr/share/
    #1542817796 cd -
    #1542817796 cd w/Edge-Agent/edge-agent-ged/
    #1542817796 dv
    #1542817796 hg diff 
    #1542817796 make 
    #1542817796 make 
    #1542817796 make 
    #1542817796 make -npq
    .
    .
    .
    

    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:

    awk '/^#[0-9]*$/ {TS = $0; next} {print TS, NR, $0}' file* | sort  -k1,1 -k2,2n
    

    .

    awk '/^#[0-9]*$/ {TS = $0; next} {print TS,  $0}' file* | sort  -mk1,1 
    
    • 0
  4. anthony
    2020-10-09T15:16:54+08:002020-10-09T15:16:54+08:00

    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

    • 0

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve