쉘에서 마지막 10 명령의 기록을 삭제하는 방법?


131

명령은 다음과 같습니다

  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 스크립트를 작성하고 히스토리 삭제를 위해 실행할 수 있습니까?


18
vi $HISTFILE원하는 것을 삭제하십시오. head -n -10자동화해야하는 경우 사용하십시오 .
Anton Kovalenko 2012

이 질문이 주제에 맞지 않습니까? 또는 이런 종류의 질문을 할 수있는 장소가 아닌가? 그렇다면이 질문을 어디에서해야합니까? 스택 교환의 위치를 ​​의미합니까?
저스틴 존

1
셸 명령은 로컬 또는 ssh를 통해 로그인했는지에 관계없이 동일하게 작동합니다.
Barmar

2
Unix와 Linux StackExchange (unix.stackexchange.com)는 아마도이 질문에 대한 더 좋은 장소 일 것입니다. 프로그래밍과 엄격하게 관련이 없기 때문에 여기서는 주제가 아닙니다.
Dan Molding

4
쉘 스크립트 프로그래밍은이 질문에 대한 이상적인 솔루션이므로 프로그래밍과 관련하여 고려해야합니다. OP가 실제로 스크립트를 구체적으로 요구했다는 사실은 말할 것도 없습니다.
SSH 이번

답변:


109

히스토리 파일을 직접 편집 해 보셨습니까?

~/.bash_history

2
OP는 수동 플러그 앤 처 그가 아닌 스크립트를 원했습니다.
Tyler Jandreau 2013

10
터미널을 다시 시작 (닫기 및 다시 열기) 한 후에 적용됩니다.
khaled_webdev

8
vim으로이 작업을 수행하면 삭제 히스토리를 찾을 수 ~/.viminfo있으므로이를 제거하십시오!
waltwood

5
때로는 메모리에 저장되어 있으며 다음 로그인 후에도 수동 편집이 유지되지 않습니다 ..
superhero

5
@FizerKhan 나는 변경 사항 .bash_history을 메모리에 저장된 내용으로 덮어 쓸 수 있음을 의미합니다 . 이 솔루션이 도움이되었다고 생각했습니다 : superuser.com/a/384383/253543
superhero

73

내 대답은 이전 답변을 기반으로하지만 기록 항목이 가장 최근에서 가장 최근에 삭제되도록 순서를 반대로 추가합니다.

현재 기록을 가져옵니다 (보려는 줄 수 조정).

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 -d1006에 대한 명령 이 생성 되고 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.


history | tail -1 | awk '{print $1}'로 단순화 할 수있다history 1 | awk '{print $1}'
조지 힐리

-bash: tac: command not foundMac OSX에서는 그렇지 않으면 이것이 가장 좋은 답변입니다.

for h in $(seq 1006 1008); do history -d 1006; done이것은 우분투 16.04에서 작동
mahfuz

짧지 만 달콤한 :for i in {1..10}; do history -d $(($HISTCMD-11)); done
연금술

30
for x in `seq $1 $2`
do
  history -d $1
done

3
첫 번째 인수에 더 높은 숫자를 사용해야합니다. 그렇지 않으면 다른 모든 명령이 삭제됩니다. 예를 들어 명령 511이 삭제되면 512가 새 511이되고 513이 새 512가됩니다. 따라서 history -d 511예상대로 작동 한 다음 history -d 512513이었던 것을 삭제하고 512는 명령 511로 기록에 남아 있습니다. .
Matthew

5
@Matthew 필요하지 않습니다. $x루프를 통해 매번 삭제하지 않고 삭제 하고 있습니다 $1. 먼저 511을 삭제하고 512가 511이됩니다. 그런 다음 511이 다시 삭제됩니다.
Barmar

@Matthew Tyler의 답변과 비슷한 의견을 보았습니다. 나는 그것을 해결하기 위해 내 해결책을 생각해 냈습니다.
Barmar

내 bash 프롬프트에서 한 줄로 이것을 쓸 때 서두르면 정확합니다 for i in... 그리고 history -d $i위의 주석에 설명 된 결과를 얻었습니다. $ 1을 사용하면 원래 답변에 명시된대로 절대적으로 맞습니다.
Matthew

18

먼저 :를 입력 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

Ubuntu 12.04에서 업데이트했지만 여전히 제대로 작동하지 않습니다. :( 행 번호 부분이 제대로 작동하지 않는 것 같습니다
Binod Kalathil

논리적 오류가 아니기 때문에 Binod의 제안 된 편집을 거부했습니다. Ghassan의 원래 코드는 Barmar의 답변과 동일한 접근 방식을 사용합니다. Barmar의 답변에 대한 의견은 1800을 교체 제안이 다른 모든 행$line삭제 한 다음 원하는 범위를 초과하는 이유를 설명 합니다.
Anthony Geoghegan

18

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


9

편집하다:

괄호 반복자를 바꿨다. 또한 역 반복자를 사용하여이 함수를 호출하십시오.

아마도 다음과 같이 할 수 있습니다 :

#!/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

경계에 대한 체크인 오류가 없습니다. 나는 그것을 독자에게 연습으로 남겨 둘 것이다.

이 질문 도 참조하십시오


6
510을 삭제하면 511이 510이되고 512가 511이됩니다. 따라서 이것은 다른 모든 줄을 삭제합니다.
Barmar

중괄호 확장에는 변수를 포함 할 수 없습니다.
chepner

seq 563 514아무것도 인쇄하지 않습니다. 당신은 필요합니다 seq 563 -1 514. 또는 다음 history -d $1과 같은 인수로 간단히 사용할 수 있습니다.514 563
anishsane

9

아마 누군가에게 유용 할 것입니다.
현재 세션의 콘솔 / 터미널 히스토리 사용자에게 로그인하면 로그 아웃시 ~ / .bash_history로 플러시되는 "버퍼"에만 존재합니다.
따라서 일을 비밀로 유지하려면 다음을 수행 할 수 있습니다.
history -r && exit
모든 세션 (및 유일한) 기록을 지우고 로그 아웃합니다.)


5

이 스레드에서 공유 된 솔루션 조합을 사용하여 명령 기록에서 추적을 삭제했습니다. 먼저 저장된 명령 내역이 어디에 있는지 확인했습니다.

echo $HISTFILE

나는 역사를 다음과 같이 편집했다.

vi <pathToFile>

그런 다음 현재 세션 기록 버퍼를 다음과 같이 플러시합니다.

history -r && exit

다음에이 세션에 들어가면 명령 기록에 표시되는 마지막 명령이 pathToFile 에 마지막으로 남았습니다 .


이것은 @jgc의 대답에 대해, 내가 서버에 다시 로그인 할 때, 역사가 다시 돌아 왔을 때, 로그인 된 세션에 대해서만 작동합니다.
Yogeshwar Tanwar


1

마지막 10 개 항목을 삭제하려면 (예 :)

history -d 511 520

1
GNU bash 버전 4.3.11 (1)에서는 목록의 첫 번째 행만 삭제합니다
Gary

1

이 스크립트를 사용하여 기록에서 마지막 10 개의 명령을 삭제합니다.

pos=$HISTCMD; start=$(( $pos-11 )); end=$(( $pos-1 )); for i in $(eval echo "{${start}..${end}}"); do history -d $start; done

$HISTCMD환경 var를 사용 하여 기록 색인을 가져오고이를 사용하여의 마지막 10 개 항목을 삭제합니다 history.


1

다음을 시도하십시오 :

for i in {511..520}; do history -d $i; echo "history -d $i"; done

그것은 그가 이미 역사를 나열하고 모든 ID를 미리 알고 있다고 가정합니다
Markoorn

그리고 그렇지 않으면, 기록 목록에서 최신 수 없습니다 : "범위를 벗어난 역사 위치"
devwebcl

그것은해야합니다 :for i in {511..520}; do history -d $i; echo "history -d 511"; done
devwebcl

1

나는 이것을 사용한다 (나는 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내가 자리에 유명한의 변형 때문이다 단말기에서 공유 역사 트릭 이 기능은 그 부분없이 휴식 것입니다. 그들은 실제 bash history내장 (그리고 내 자신의 래퍼가 아닌)에 대한 호출을 보장 하고 항목이 제거 된 직후 히스토리를 기록합니다.

그러나 이것은 "정상"히스토리 구성에서와 같이 작동합니다.

제거하려는 마지막 항목 수로 호출해야합니다. 예를 들면 다음과 같습니다.

histrm 10

마지막 10 개 항목을 제거합니다.


1
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;

무차별하지만 기능적


0
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으로 변경하십시오.


0

간단한 함수는 숫자로 모두 죽일 수 있습니다 (오류로 인해 바프가 발생하지만)

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`

0

짧지 만 달콤한 : for i in {1..10}; do history -d $(($HISTCMD-11)); done

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.