여러 타임스탬프가 있는 .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 매크로 언어에 대한 설명.

답변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"를 메모리의 쉘 "history"와 병합합니다. 타임스탬프의 순서와 해당 타임스탬프 내의 명령 순서는 유지됩니다.

정의된 Perl RE에 따라 고유한 명령(여러 줄 포함)을 제거하거나 단순하고 민감한 명령을 제거(지우기)하는 옵션이 있습니다. 맞게 조정하세요!

결과는 다음과 같습니다. https://antofthy.gitlab.io/software/history_merge.bash.txt

스크립트의 첫 번째 "perl" 명령은 단순히 입력 기록 파일을 연결합니다. 기본값은 "$HISTFILE" <(history -w /dev/stdout)디스크 내 기록을 메모리 내 기록과 병합하여 타임스탬프가 있는 레코드로 분할하는 것입니다. 그런 다음 두 번째 "perl"이 병합을 수행합니다.

필요에 따라 디스크 기록이나 메모리 기록을 대체할 수 있는 임시 파일에 결과를 저장합니다(현재 둘 다 가능).

적합하게 조정하십시오.

즐기다

관련 정보