Bash 기록 파일에서 특정 줄을 제거하십시오.


답변:


108

history -a현재 기록이 디스크에 커밋되도록 로그 아웃했다가 다시 로그인하거나 실행 해야합니다.

그런 다음 파일을 편집하십시오 ~/.bash_history.


19
HISTFILE 환경 변수가 설정되면 히스토리 파일은 ~ / .bash_history가 아니라 $ {HISTFILE}입니다.
Karolos

20
쉘을 종료하면 항목이 내역 파일에 기록됩니다. 따라서 제거하려는 명령을 입력 한 후 로그 아웃했다가 다시 로그인하거나 'history -d xxxx'를 사용하여 현재 쉘 세션에서 제거해야합니다.
harmic

3
기록 파일 편집 기록을 어떻게 삭제 하시겠습니까?
chiliNUT

5
@chiliNUT : vim ~/.bash_history공백으로 명령을 시작하십시오 (예 :) . 공백으로 시작하는 명령은 일반적으로 기록되지 않습니다 (참조 $HISTCONTROL).
cyrus

나는 그것이 배포판의 경우는 아니라고 생각하지만 일반적으로 말이된다
chiliNUT

149

다음 두 단계로 명령 행을 사용하여 히스토리 파일에서 제거 할 수 있습니다.

  1. 입력 history -d <line_number>하면 메모리의 기록에서 지정된 행이 삭제됩니다.
  2. 입력 history -w하면 현재 메모리 내 기록이 ~/.bash_history파일에 기록 됩니다.

두 단계는 메모리 내 히스토리.bash_history 파일에서도 라인을 영구적으로 제거합니다 .


7
history -w역사 에서 마지막을 삭제하는 방법 ?
KrIsHnA

@KrIsHnA 수동으로 ~ / .bash_history 편집
Alexander Myshov

5
또는 @tao의 답변에서와 같이 추가되지 않도록 공백을 추가하십시오.
Mark

찾으려면 <line_number>단지 history | grep [unwanted_content]모든 라인을 포함하여 목록을 얻으려면 [unwanted_content](암호와 같은).
AvL

여러 개의 (특정) 줄을 어떻게 삭제합니까?
Pathros 2016 년

39

명령이 먼저 히스토리에 추가 되지 않도록 하려면 환경 변수 HISTCONTROL가 콜론으로 구분 된 값 사이에 값을 포함 하는지 확인하십시오 ignorespace(예 :에 추가 .bashrc).

$ export HISTCONTROL=ignorespace

이렇게하면 선행 공백이있는 명령이 기록에 추가되지 않습니다. 그런 다음 실행하여 기록을 완전히 지울 수 있습니다.

$  history -c -w
  ^-- additional space character

32

우선, 발행하려는 명령이 민감하거나 안전하지 않거나, 당신의 역사를 혼란스럽게 만들 필요가 없다면, 처음부터 역사에 들어가는 것을 막는 것이 가장 좋습니다. 다음이 $HISTCONTROL포함되어 있는지 확인하십시오 ignorespace.

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace

그런 다음 역사에서 원하지 않는 명령을 공백으로 진행하십시오.

(bash)$  sensitive-cmd-with --password 82cf7dfe
(bash)$  rm -r... # One-off recursive remove; mustn't be accidentally repeated!

bash 세션이 여전히 열려 있으면 원하지 않는 명령을 기록에 실수로 넣은 경우 명령이 디스크에 아직 닿지 않았습니다. 히스토리에서 이전 명령을 삭제하려면 다음을 실행하십시오.

(bash)$  history -d $((HISTCMD-1))

선행 공간에 유의하십시오. 이 명령은을 요구합니다 ignorespace. 그렇지 않으면 그냥 삭제됩니다!

마지막 몇 개의 명령을 삭제하려면 마지막 기록 번호와 첫 번째 기록 번호를 찾으십시오.

(bash)$  history 5
  598  ok
  599  sensitive
  600  unsafe
  601  doesn\'t-work
  602  otherwise-unwanted

이 경우 602와 599입니다. 다음을 발행하십시오.

(bash)$  for i in {602..599}; do history -d $i; done

(가 없으면 ignorespace603..599입니다.)

당신이 원하지 않는 경우 어떤 디스크를 칠 현재 세션에서 역사를 종료 사용 :

(bash)$ kill -9 $$

이론적으로는 비 휘발성 미디어에서 삭제 된 데이터를 복구 할 수 있기 때문에 지금까지의 접근 방식은 보안을 강화하기 위해 민감한 기록 항목을 디스크에 쓰지 못하게하는 것입니다.

그러나 제거하려는 명령이 이전 세션에있는 경우 이미 종료시 추가되었습니다 $HISTFILE. 위의 명령으로 역사를 조작하는 것은 여전히 것입니다 추가 나머지 받는 항목을 $HISTFILE, 종료시 . 하려면 덮어$HISTFILE의 현재 세션의 견해와 전체 역사, 현재 , 문제 :

(bash)$  history -w

물론 디스크에 이미 기록 항목이있는 경우 history -d명령을 사용하여 기록을 편집하는 대신 텍스트 편집기를 사용 history -w하여 편집 할 수 $HISTFILE있습니다.


1
"위의 명령으로 역사를 조작하는 것은 여전히 것입니다 추가 나머지 받는 항목을 $HISTFILE, 종료시 ."사실,이 정확히 사실이 아니다. 원래 기록 길이에서 '고착 된'남은 새 항목 만 추가하는 것 같습니다. 예를 들어 5 개의 원본 항목을 제거하고 15 개의 새로운 항목을 추가하면 마지막 10 개의 새로운 항목 만 추가되지만 15 개의 새로운 항목이 모두 추가 될 것으로 예상됩니다. 이것이 어떻게 바람직한 기능인지 알 수 없기 때문에 이것이 버그라고 생각합니다.
James Haigh

1
bash는 원래 길이를 기록합니다. 세션 종료시이 값보다 큰 번호의 항목을 추가합니다. 이 값이이 값보다 작거나 같은 항목을 삭제할 때마다이 값이 감소하면 예상대로 작동합니다. ;-)
James Haigh

15

몇 가지 기술 :

중요한 정보가 기록 파일에 저장되지 않도록 방지

명령 행에 암호를 입력 한 경우 모든 명령이 기록되었음을 알 수 있습니다.

  1. 히스토리를 저장하지 않고 현재 세션을 강제 종료하십시오.

     kill -9 $$

    모든 현재 기록이 삭제됩니다.

  2. 유형 ↑ (up arrow)민감한 정보까지 오픈 bash는 세션에서 다음과 같은 행 편집 키를 사용하여 표시됩니다 Ctrl+ W민감한 정보를 삭제하고, 다음 ↓ (down arrow) 비어있는 새 라인은 메시지가 표시 될 때까지 이전에 입력 Enter.

히스토리 파일에서 민감한 정보 삭제

중요한 정보가 이미 저장되어 있고 전체 기록이 아닌 삭제하려는 경우 :

간단한 sed명령으로 작업을 수행 할 수 있습니다.

sed -e '/SeNsItIvE InFo/d' -i .bash_history

그러나이 정보를 입력하면 삭제하려는 검색 패턴 (민감한 정보)이 포함 된 다른 히스토리 라인이 작성됩니다. 그래서 당신은 할 수 있습니다 :

sed -e "/$(head -n1)/d" -i .bash_history

이것은 head -n1터미널의 입력으로 실행 됩니다. 터미널이 정지 된 것으로 보입니다 (프롬프트가 표시되지 않음). 파일에서 삭제하려는 정보를 입력하십시오. 이것은 실제로 명령 줄에 명령을 입력하지 않고 명령을 입력 (일부) 할 수있게하여 기록 기록에 포함시킬 수없는 방법입니다. 그런 다음 sed입력 한 텍스트를 사용 .bash_history 하여 중요한 정보가 포함 된 모든 줄 을 검색 하고 삭제합니다. 참고 : 민감한 정보 패턴에 슬래시가 포함되어 있으면 백 슬래시로 이스케이프하거나이 sed구문을 사용하여 패턴에 나타나지 않는 구분자를 지정하도록 명령을 변경 해야합니다.

sed -e "\|$(head -n1)|d" -i .bash_history

다른 방법은 중요한 정보 만 삭제하고 정보가 포함 된 명령을 유지하는 것입니다. 이를 위해 민감한 정보를 원하는 대체 텍스트로 간단히 대체 할 수 있습니다.

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.

특정 트리의 모든 파일에서 중요한 정보를 삭제합니다

마지막으로, 이것이 잊어 버린 다른 파일에 남아 있지 않도록 확인하십시오 .

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"

관련된 모든 파일을 나열합니다.

find . -type f -print0 |
    xargs -0 grep -l "$SENSITIVEINFO" |
    tr \\n \\0 |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

는 루트 디렉토리에있는 모든 파일에서 중요한 정보를 모두 대체합니다 .. 참고 :이 명령은을 사용하더라도 xargs -0이름에 줄 바꿈이있는 파일은 처리하지 않습니다.


11

삭제할 줄이 ↑ (up arrow)나타날 때 까지을 눌러 찾은 다음 Ctrl+ 를 누릅니다 U. 그 줄을 제거해야합니다.

history명령 을 사용하면 행이 별표로 대체 된 것을 볼 수 있습니다.


2
실제로 줄 위로 커서를 이동하고 Ctrl + U 를 누른 다음 다른 줄로 커서를 위 또는 아래로 이동 해야한다고 생각합니다 (목록의 맨 아래에있는 빈 ). 또한 엄밀히 말하면 줄은 별표로 대체되지 않았습니다. 오히려 명령이 지워졌고 이력 번호 에가 추가되었습니다 *.
G-Man

1
이것은 Ctrl + R (역 증분 히스토리 검색)으로 더욱 강력 해집니다. 예를 들어 [End], Ctrl + U
sehe

4

동시에 여러 줄을 제거 해야하는 경우 일반적으로 다음을 사용합니다.

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'

마지막 명령을 제거해야 할 경우 다음을 사용할 수 있습니다.

history -d $((HISTCMD-2))

2
이것은 일처럼 보였다하지만 history | grep <string>여전히 ... 그것을 삭제 주장 모든 라인을 보여줍니다
브록 헨슬리를

1
이것은 fisrt를 삭제 한 후 잘못된 히스토리 라인을 삭제합니다 !!
mivk December

1
그러나 다행히도 잘못된 삭제 명령 만 인쇄합니다. 다음은 올바른 삭제 명령을 인쇄합니다.history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
mivk

3

히스토리에서 여러 줄을 제거해야하는 경우 다음 bash 함수를 사용하면 시간을 절약 할 수 있습니다.

function histdel() {
    [ $# -eq 1 ] && history -d "$1" && history -w
    if [ $# -eq 2 -a "$1" -le "$2" ]; then
        for n in `seq "$2" "$1"`; do
            history -d "$n"
        done
        history -w
    fi
}

기능은 일반적으로에 추가해야합니다 $HOME/.bashrc. 이 기능을 즉시 사용하려면 실행중인 쉘 ( . $HOME/.bashrc) 이 파일을 다시 읽도록해야합니다 . 그런 다음 히스토리에서 명령 200-210을 삭제하려면 다음을 수행하십시오.

$ histdel 200 210

(참고 : bash history에서 다양한 명령을 삭제하면이 질문은 가장 많이 검색되는 결과 중 하나입니다. 따라서 위의 내용은 질문에서 요구하는 것 이상이지만 일부 독자에게는 유용 할 수 있습니다.)


3
for진술의 대안 양식 : for n in $(seq "$2" "$1")일부는 문체 적으로 선호하며 seq작동하지 않으면을 시도하십시오 for ((n="$2"; n>="$1"; n--)).
Scott

3
history | sed -i 59d

줄 번호는 59입니다. 이보다 더 달콤한 것은 없습니다 :)


3

이것들을 시도해보십시오.

$ history

이것은 히스토리의 ID와 명령을 표시합니다.

.
.
211 LS
212 javac Welcome.java
213 자바 환영
.
.

사용하다,

$ history -d 211

여기서 211은 역사의 id입니다. 이제 이것을 사용하여 확인하십시오.

$ history

.
.
211 javac Welcome.java
212 자바 환영
.
.


2

이 질문에 대한 답변을받은 지 오랜 시간이 걸렸지 만 내 기록 파일을 정리하고 동시에 로그 아웃하는 방법을 보여 드리겠습니다.

난 달린다 : history -w && nano "${HISTFILE}" && history -c && exit

그것이하는 일은 간단합니다.

  1. history -w : 캐시 된 기록을 내부에 기록 "${HISTFILE}"
  2. nano "${HISTFILE}": 편집 "${HISTFILE}"할 수 있습니다. sed 스크립트를 사용하거나 원하는 것을 정리할 수 있습니다."${HISTFILE}"
  3. history -c : 캐시 된 히스토리를 지우면이 마지막 명령이 추가되지 않습니다.
  4. exit : 캐시 된 기록을 추가하여 로그 아웃하십시오 ...하지만 비어 있습니다.)

해당 명령이 끝나면 클린 히스토리 파일로 로그 아웃됩니다. 역사를 확인하려면 로그인하십시오;)

이것이 누군가를 도울 수 있기를 바랍니다.


1

nano .bash_historybash 쉘에있는 경우 히스토리 파일을 직접 편집 할 수도 있습니까?

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