명령은 다음과 같습니다
511 clear
512 history
513 history -d 505
514 history
515 history -d 507 510 513
516 history
517 history -d 509
518 history
519 history -d 511
520 history
으로 하나를 삭제할 수 history -d 511
있지만 쉘에서 단일 명령을 사용하여 마지막 10 개의 명령과 10 개의 명령 기록을 삭제하는 방법은 무엇입니까?
bash 스크립트를 작성하고 히스토리 삭제를 위해 실행할 수 있습니까?
답변
히스토리 파일을 직접 편집 해 보셨습니까?
~/.bash_history
답변
내 대답은 이전 답변을 기반으로하지만 기록 항목이 가장 최근에서 가장 최근에 삭제되도록 순서를 반대로 추가합니다.
현재 기록을 가져옵니다 (보려는 줄 수 조정).
history | tail -n 10
이것은 나에게 같은 것을 준다
1003 25-04-2016 17:54:52 echo "Command 1"
1004 25-04-2016 17:54:54 echo "Command 2"
1005 25-04-2016 17:54:57 echo "Command 3"
1006 25-04-2016 17:54:59 echo "Command 4"
1007 25-04-2016 17:55:01 echo "Command 5"
1008 25-04-2016 17:55:03 echo "Command 6"
1009 25-04-2016 17:55:07 echo "Command 7"
1010 25-04-2016 17:55:09 echo "Command 8"
1011 25-04-2016 17:55:11 echo "Command 9"
1012 25-04-2016 17:55:14 echo "Command 10"
삭제할 항목의 시작 및 끝 위치를 선택하십시오. 1006에서 1008까지의 항목을 삭제하겠습니다.
for h in $(seq 1006 1008); do history -d 1006; done
그러면 history -d
1006에 대한 명령 이 생성 되고 1007이 1006이되고 1006이 삭제 된 다음 1008 (1007이 됨)이 이제 1006이되어 삭제됩니다.
history delete 명령도 삭제하려면 현재 최대 내역 항목을 알아야하기 때문에 조금 더 복잡합니다.
이것을 통해 얻을 수 있습니다 (더 나은 방법이있을 수 있습니다).
history 1 | awk '{print $1}'
이를 조합하여 범위를 삭제하고 history delete 명령을 삭제할 수도 있습니다.
for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')
이 모든 것을 함수에 싸서 다음에 추가하십시오 ~/.bashrc
.
histdel(){
for h in $(seq $1 $2); do
history -d $1
done
history -d $(history 1 | awk '{print $1}')
}
명령 4, 5 및 6 (1049-1051)을 삭제하고 증거를 숨기는 예 :
[18:21:02 jonathag@gb-slo-svb-0221 ~]$ history 11
1046 25-04-2016 18:20:47 echo "Command 1"
1047 25-04-2016 18:20:48 echo "Command 2"
1048 25-04-2016 18:20:50 echo "Command 3"
1049 25-04-2016 18:20:51 echo "Command 4"
1050 25-04-2016 18:20:53 echo "Command 5"
1051 25-04-2016 18:20:54 echo "Command 6"
1052 25-04-2016 18:20:56 echo "Command 7"
1053 25-04-2016 18:20:57 echo "Command 8"
1054 25-04-2016 18:21:00 echo "Command 9"
1055 25-04-2016 18:21:02 echo "Command 10"
1056 25-04-2016 18:21:07 history 11
[18:21:07 jonathag@gb-slo-svb-0221 ~]$ histdel 1049 1051
[18:21:23 jonathag@gb-slo-svb-0221 ~]$ history 8
1046 25-04-2016 18:20:47 echo "Command 1"
1047 25-04-2016 18:20:48 echo "Command 2"
1048 25-04-2016 18:20:50 echo "Command 3"
1049 25-04-2016 18:20:56 echo "Command 7"
1050 25-04-2016 18:20:57 echo "Command 8"
1051 25-04-2016 18:21:00 echo "Command 9"
1052 25-04-2016 18:21:02 echo "Command 10"
1053 25-04-2016 18:21:07 history 11
문제는 실제로 기록에서 마지막 10 개의 명령을 삭제하는 것이 었으므로 약간의 노력을 절약하려면 다른 함수를 사용 histdel
하여 계산을 수행하는 함수를 호출 할 수 있습니다.
histdeln(){
# Get the current history number
n=$(history 1 | awk '{print $1}')
# Call histdel with the appropriate range
histdel $(( $n - $1 )) $(( $n - 1 ))
}
이 함수는 삭제할 이전 히스토리 항목 수인 1 개의 인수를 사용합니다. 따라서 역사에서 마지막 10 개의 명령을 삭제하려면을 사용하십시오 histdeln 10
.
답변
for x in `seq $1 $2`
do
history -d $1
done
답변
먼저 :를 입력 history
하고 제거하려는 일련 번호를 적어 둡니다.
1800 행에서 1815 행까지 줄을 지우려면 터미널에 다음을 작성하십시오.
$ for line in $(seq 1800 1815) ; do history -d 1800; done
삭제 명령에 대한 기록을 삭제하려면 1815 = 1816에 +1을 추가하고 해당 시퀀스에 대한 기록 + 삭제 명령을 삭제합니다.
예를 들면 다음과 같습니다.
$ for line in $(seq 1800 1816) ; do history -d 1800; done
답변
Bash 5를 사용하면 범위를 할 수 있습니다 … Hooray !:
history -d 511-520
또는 거꾸로 세기 10 :
history -d -10--1
Bash 5 Man Page 에서 발췌 :
‘역사’
옵션 (제공된 경우)의 의미는 다음과 같습니다.
‘-d OFFSET’OFFSET 위치에서 히스토리 항목을 삭제합니다. OFFSET이 양수이면 기록이 표시 될 때 표시되는대로 지정해야합니다. OFFSET이 음수 인 경우 마지막 기록 위치보다 1이 큰 것으로 해석되므로 음수 인덱스는 기록의 끝부터 카운트 백되며 ‘-1’의 색인은 현재 ‘history -d’명령을 나타냅니다.
‘-d START-END’START와 END 위치 사이의 히스토리 항목을 포함하여 삭제하십시오. START 및 END의 양수 및 음수 값은 위에서 설명한대로 해석됩니다.
Bash 4에 대한 내 솔루션은 다음과 같습니다. 단일 항목 또는 가장 낮은 색인으로 시작하는 기록 범위를 반복적으로 삭제합니다.
delHistory () {
count=$(( ${2:-$1} - $1 ))
while [[ $count -ge 0 ]]; do
history -d "$1"
((count--))
done
}
delHistory 511 520
답변
위에서 답변을 결합 :
history -w
vi ~/.bash_history
history -r
답변
편집하다:
괄호 반복자를 바꿨다. 또한 역 반복자를 사용하여이 함수를 호출하십시오.
아마도 다음과 같이 할 수 있습니다 :
#!/bin/bash
HISTFILE=~/.bash_history # if you are running it in a
# non interactive shell history would not work else
set -o history
for i in `seq $1 $2`;
do
history -d $i
done
history -w
다음과 같이 불러 일으키는 곳 :
./nameOfYourScript 563 514
경계에 대한 체크인 오류가 없습니다. 나는 그것을 독자에게 연습으로 남겨 둘 것이다.
이 질문 도 참조하십시오