.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マクロ言語の説明。