.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"를 메모리의 쉘 "history"와 병합합니다. 타임스탬프의 순서와 해당 타임스탬프 내의 명령 순서는 유지됩니다.
정의된 Perl RE에 따라 고유한 명령(여러 줄 포함)을 제거하거나 단순하고 민감한 명령을 제거(지우기)하는 옵션이 있습니다. 맞게 조정하세요!
결과는 다음과 같습니다. https://antofthy.gitlab.io/software/history_merge.bash.txt
스크립트의 첫 번째 "perl" 명령은 단순히 입력 기록 파일을 연결합니다. 기본값은 "$HISTFILE" <(history -w /dev/stdout)
디스크 내 기록을 메모리 내 기록과 병합하여 타임스탬프가 있는 레코드로 분할하는 것입니다. 그런 다음 두 번째 "perl"이 병합을 수행합니다.
필요에 따라 디스크 기록이나 메모리 기록을 대체할 수 있는 임시 파일에 결과를 저장합니다(현재 둘 다 가능).
적합하게 조정하십시오.
즐기다