合并多个带有时间戳的 .bash_history 文件

合并多个带有时间戳的 .bash_history 文件

.bash_history我通过在虚拟机上的快照之间切换来生成多个文件。我想将所有这些文件恢复到.bash_history当前运行的实例中的单个实时文件中。

这些文件中有时间戳,我想尽可能保留它们。但是,有些行似乎没有时间戳。例如:

#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

我想按时间戳对合并列表进行排序,因为我在快照和文件之间来回切换。如果命令没有可用的时间戳,我们可以根据之前的最后一个时间戳和之后的第一个时间戳来推断它。

答案1

使用 GNU m4(支持编号转移最多 LONG_MAX)以及一些额外的内容sed来准备输入:

#!/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

用法:

cat edgeos_history.* | sort_history.sh > merged_history

m4_chunk函数完成了大部分工作,因为当所有输入结束时,单独的块将按升序数字顺序“不变”。脚本的其余部分是为了保护m4_输入中的任何引号和现有序列不被 解释m4

LQ以及RQ基于 Michael Breen 中的定义M4 宏语言的注释

答案2

为什么不做类似的事情cat /path/to/one/.bash_history >> /path/to/live/.bash_history,然后您可以删除重复的输入,然后awk '!seen[$0]++' .bash_history >> .bash_history2删除原始输入并将 .bash_history2 重命名为 .bash_history。然而,像这样删除重复项将留下空的时间戳。

答案3

这会有所帮助吗:

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
.
.
.

确保将所有历史文件列为awk.

编辑:一些不太令人满意、不可移植的文章保留了命令的原始顺序:

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 

答案4

很长一段时间以来,我一直在寻找一种合并 bash 历史记录(带有时间戳)的方法,但似乎没有什么可以接受的。

也就是说...将磁盘上的“.bash_history”与内存中的 shell“history”合并。保留时间戳顺序以及这些时间戳内的命令顺序。

根据定义的 perl RE,可以选择删除唯一命令(即使是多行),和/或删除(清除)简单和/或敏感命令。调整以适应!

这是结果: https://antofthy.gitlab.io/software/history_merge.bash.txt

脚本中的第一个“perl”命令只是连接输入历史文件。默认将"$HISTFILE" <(history -w /dev/stdout)磁盘上的历史记录与内存中的历史记录合并,将它们分成带时间戳的记录。然后第二个“perl”进行合并。

它将结果保存在临时文件中,该文件可以根据需要替换磁盘历史记录或内存历史记录(当前两者都可以)。

调整以适应。

享受

相关内容