複数のタイムスタンプを持つ.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

LQRQMichael Breenの定義に基づいてM4マクロ言語の説明

おすすめ記事