셸에서 마지막 10개의 명령어 이력을 삭제하려면 어떻게 해야 합니까?
명령어는 다음과 같습니다.
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 명령도 삭제할 경우 현재 max history 엔트리를 알아야 하기 때문에 조금 더 복잡합니다.
(더 좋은 방법이 있을 수 있습니다)
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
.
Bash 5를 사용하면 범위를 지정할 수 있습니다.만세!
history -d 511-520
또는 거꾸로 10을 세는 경우:
history -d -10--1
'이력
옵션(제공된 경우)의 의미는 다음과 같습니다.
'-d OFFSET' OFFSET 위치에서 이력 항목을 삭제합니다.OFFSET이 양수이면 이력이 표시될 때 나타나는 대로 지정해야 합니다.OFFSET이 음수인 경우 마지막 이력 위치보다 큰 위치에 상대적인 것으로 해석되므로 음수 인덱스는 이력 끝에서 카운트백되고 '-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
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
deletion 명령어 이력을 삭제하려면 1815 = 1816에 +1을 추가하면 해당 시퀀스 + deletion 명령어 이력이 삭제됩니다.
예를 들어 다음과 같습니다.
$ for line in $(seq 1800 1816) ; do history -d 1800; done
위의 답변을 조합합니다.
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
내가 경계에 대해 체크하는 데 오류가 없다는 것을 알 수 있습니다.그것은 독자에게 연습으로 남겨 두겠습니다.
이 질문도 참조해 주세요.
아마 누군가에게 유용할 것이다.
현재 세션의 콘솔/터미널 이력을 가진 사용자에게 로그인하면 로그아웃 시 ~/.bash_history로 플러시되는 일부 "버퍼"에만 존재합니다.
기밀을 유지하기 위해 다음 작업을 수행할 수 있습니다.
history -r && exit
및 유일한)클리어한 됩니다.
이 스레드에서 공유되는 솔루션의 조합을 사용하여 명령어 이력에서 트레이스를 지웠습니다.먼저, 에 저장된 명령어 이력을 다음과 같이 확인했습니다.
echo $HISTFILE
다음을 사용하여 이력을 편집했습니다.
vi <pathToFile>
그 후 현재 세션 이력 버퍼를 다음과 같이 플러시합니다.
history -r && exit
다음에 이 세션을 시작할 때 명령어 이력에 표시되는 마지막 명령어는 pathToFile에 남겨진 마지막 명령어입니다.
직접 요청한 답변이 아니라 질문의 근본 원인일 수 있습니다.
명령어 앞에 공백 문자를 붙이면 명령어가 이력에도 들어가지 않도록 할 수도 있습니다.
# This command will be in the history
echo Hello world
# This will not
echo Hello world
마지막 10개의 엔트리를 삭제합니다(예에 따라).
history -d 511 520
short만:: short short short short short short short:for i in {1..10}; do history -d $(($HISTCMD-11)); done
for h in $(seq $(history | tail -1 | awk '{print $1-N}') $(history | tail -1 | awk '{print $1}') | tac); do history -d $h; done; history -d $(history | tail -1 | awk '{print $1}')
10줄을 삭제하려면 N의 값을 10으로 변경하기만 하면 됩니다.
이 스크립트를 사용하여 과거 10개의 명령어를 삭제합니다.
pos=$HISTCMD; start=$(( $pos-11 )); end=$(( $pos-1 )); for i in $(eval echo "{${start}..${end}}"); do history -d $start; done
it it를 한다.$HISTCMD
하여 환경var의 합니다.history
.
이것을 사용합니다(bash 4가 있습니다).
histrm() {
local num=${1:- 1}
builtin history -d $(builtin history | sed -rn '$s/^[^[:digit:]]+([[:digit:]]+)[^[:digit:]].*$/\1/p')
(( num-- )) && $FUNCNAME $num
builtin history -w
}
그builtin history
전번과 마찬가지로 부품-w
왜냐하면 단말간에 역사를 공유하는 유명한 트릭의 변형을 가지고 있기 때문에, 그러한 부품이 없으면, 이 기능은 망가져 버리기 때문입니다.진정한 배시에 대한 콜을 보증합니다.history
엔트리가 삭제된 직후 HISTFILE에 이력을 쓸 수 있습니다.
다만, 이것은 「통상적인」이력 설정에서는 그대로 동작합니다.
삭제할 마지막 엔트리의 수를 사용하여 호출해야 합니다.다음은 예를 제시하겠습니다.
histrm 10
마지막 10개의 엔트리를 삭제합니다.
history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;
강력하지만 기능적
history -c
모든 이력을 삭제합니다.
단순한 함수는 숫자로 모두 종료할 수 있습니다(오류 발생 시 토함).
kill_hist() {
for i in $(echo $@ | sed -e 's/ /\n/g;' | sort -rn | sed -e 's/\n/ /;')
do
history -d $i;
done
}
kill_hist `seq 511 520`
# or kill a few ranges
kill_hist `seq 1001 1010` `seq 1200 1201`
다음을 시도해 보십시오.
for i in {511..520}; do history -d $i; echo "history -d $i"; done
그history -d
arg는 범위를 지정하여$HISTCMD
이력의 최대치입니다.
이 함수는 마지막을 제거하는 데 사용됩니다.n
이력에서 엔트리를 삭제합니다(같은 것을 삭제하는 history 명령어 수만 입력해 주세요.rmhist 5
) :
$ rmhist() { history -d $(($HISTCMD - $1))-$HISTCMD ;}
또는 다음과 같은 arg를 사용하여 기록(포함) 또는 마지막 'n' 명령을 제거합니다.
rmhist() {
case $1 in
--from|from) local start=$2; ;;
--last|last) local start=$(($HISTCMD - $2)) ;;
*) echo "Try rmhist --from # or rmhist --last n "; return ;;
esac;
history -d ${start}-${HISTCMD}
}
결과는 다음과 같습니다.
5778 ls /etc
5779 ls /tmp
5780 ls /dev
5781 ll
5782 cd /tmp
5783 cd
5784 history
(base) ~ $ rmhist --last 3
(base) ~ $ history 5
5778 ls /etc
5779 ls /tmp
5780 ls /dev
5781 ll
5782 history 5
(base) ~ $ rmhist --from 5780
(base) ~ $ history 5
5776 history 10
5777 ls
5778 ls /etc
5779 ls /tmp
5780 history 5
#delete ten times the last history line
for i in $(seq 1 10)
do
n=$(history 1 | awk '{print $1}')
history -d $n
done
언급URL : https://stackoverflow.com/questions/14750650/how-to-delete-history-of-last-10-commands-in-shell
'programing' 카테고리의 다른 글
POI API를 사용하여 Excel에 백분율 값 표시 (0) | 2023.04.16 |
---|---|
어떻게 하면 Excel의 따옴표를 대체 공식으로 바꿀 수 있을까요? (0) | 2023.04.16 |
XAML DataGridColumn을 DataGrid 전체로 채우려면 어떻게 해야 합니까? (0) | 2023.04.16 |
인터랙티브 프로그램으로 비인터랙티브하게 인수 전달 (0) | 2023.04.16 |
WPF Value Converter - 변환할 수 없는 값의 표준 반환 (0) | 2023.04.16 |