Home » OS » 리눅스 » bash history 특정 라인과 전체 삭제하는 방법을 알아봅시다.

bash history 특정 라인과 전체 삭제하는 방법을 알아봅시다.

이 글에서는 bash history 기록을 전체 삭제할 수 있는 -c 와, 특정한 라인을 삭제할 수 있는 -d 옵션을 알아보고자 합니다. zsh history에서 -d 옵션은 지원되지 않으니, 주의가 필요합니다.


history -c 옵션

먼저, -c 옵션은 아래와 같습니다.

  • 명령어 기록 목록을 모두 삭제합니다.

여기서 명령어 기록 목록은 무엇일까요? 메모리에 저장되어 있는 것을 의미합니다.

[그림 1] 기록 파일에 있는 log

기록 파일에 exit 명령어를 친 기록만 있습니다.

[그림 2] history 명령어를 쳤을 때 기록

그런데, history를 쳤을 때에는 다르게 나옵니다. 왜 그렇다고 했나요? sync가 맞지 않아서 그렇습니다.

[그림 3] bash history -c 명령어

-c 옵션을 추가해서, 히스토리를 지워 봅시다. 그리고 다시 history를 보면, 아무것도 출력이 되지 않음을 볼 수 있어요. 그런데 기록 파일에는 남아 있어요.

이는 메모리에 전체 기록을 지우기만 할 뿐, 파일에 반영하지 않기 때문이에요. 파일에까지 반영하기 위해서는 bash 명령어 기록을 어떻게 파일에 반영하는 방법 [link] 을 보시면 되겠습니다.


특정한 줄을 삭제하는 -d 옵션

이제 -d 옵션을 보겠습니다.

  • -d offset
    • offset 위치에 있는 기록 목록을 삭제합니다.
    • 만약 offset이 음수라면 맨 끝에서부터 거꾸로 셉니다.

이게 전부입니다. 당연하게도, 기록 목록만 변경하기 때문에, 결과가 파일에 반영되지 않습니다. 이 점을 조심해야 합니다. 예를 들어, offset이 3이라면, 기록 목록 중 3번째를 삭제합니다. offset이 5인 경우에는 기록 목록 중 5번째 것을 삭제합니다. 이것도 예시를 보겠습니다.

[그림 4] 기록 목록에 있는 log

먼저, 메모리 상에 echo 1, … , echo 5, history 순으로 명령어를 입력한 기록이 있습니다. 여기서 5번째로 입력한 echo 5를 삭제하고 싶습니다. 그러면 어떻게 입력하면 될까요?

[그림 5] -d 옵션

history -d 5를 입력하면 됩니다. 이는, 기록 목록 중 5번째를 삭제한다는 의미입니다. 삭제 후, 다시 목록을 보면, echo 5가 사라진 것을 볼 수 있습니다. 만약에 음수라면 어떻게 될까요?

[그림 6] offset이 음수인 경우

history를 입력했을 때, echo 1, … , echo 6, history 순으로 저장되어 있었습니다. offset을 -3으로 주었습니다. 이 경우, 어떤 것이 지워질까요? 얼핏 보아서는 끝에서부터 3번쨰인 echo 5가 지워질 거 같습니다. 결과를 볼까요?

[그림 7] 실제로 지워지는 기록

실제로는 echo 5가 아니라 echo 6이 지워졌어요. 왜 그럴까요?

이는 history -d -3이 메모리에 추가된 후에 offset을 검사하기 때문입니다. 해당 명령이 추가된 후에는, 끝에서 1번째는 history -d 3이 됩니다. 따라서, 끝에서 3번째는 echo 5가 아닌 echo 6이 됩니다. 이를 이용하면, bash history에서 내가 작성한 명령어를 메모리에 저장하지 않게 하는 방법이 있습니다.

[그림 8] offset에 -1을 주기

history -d -1 명령어와 내가 작성할 명령어를 && 로 연결해 주면 됩니다. export A=1은 제가 작성한 명령어입니다.

history -d -1과 export A=1이 &&로 연결된 명령어가 memory에 들어갈 텐데요. 이 경우, 끝에서 1번째가, 해당 명령어를 가리키게 됩니다. 따라서, offset으로 -1을 주면 됩니다.


bash history 여러 줄 삭제

여러 줄을 삭제하기 위해서는 어떻게 하면 될까요? range가 있는 경우 1-3과 같이 dash를 붙이면 됩니다. 그런데 2번째 줄과 5번째 줄을 삭제해야 하는 경우에는 어떻게 해야 할까요? 이 경우, 범위가 여러 개입니다. 그런가요? 그러면, 2개의 명령어를 && 로 연결을 하는 방법이 있습니다. 범위가 모두 valid 하다면.

[그림 9] 여러 명령어를 연결해서 삭제하기

예를 들어 2, 5번째 줄을 삭제해야 한다고 해 봅시다. 이 경우, history -d 5, history -d 2 순서대로 실행시키면 됩니다. 왜냐하면, a && b는 a 명령어가 실행되고 난 후, b 명령어가 실행되는 것이기 때문입니다.

[그림 10] 실행 결과

echo 2, echo 5가 삭제되었음을 볼 수 있습니다.

Leave a Comment

5 × 4 =