Bash 기록에서 마지막 N 줄을 제거하십시오.

Bash 기록에서 마지막 N 줄을 제거하십시오.

실수로 파일을 셸에 붙여넣으면 bash 기록에 보기 흉하고 의미 없는 항목이 잔뜩 남게 됩니다. 이러한 항목을 제거하는 깔끔한 방법이 있습니까? 분명히 쉘을 닫고 .bash_history파일을 수동으로 편집할 수 있지만 현재 쉘의 기록을 수정하는 데 사용할 수 있는 일종의 API가 있을까요?

답변1

명령 프롬프트의 이 줄이 도움이 될 것입니다.

for i in {1..N}; do history -d START_NUM; done

여기서 START_NUM은 기록 항목의 시작 위치입니다. N은 삭제하려는 항목 수입니다.

전임자:for i in {1..50}; do history -d 1030; done

답변2

이제부터 명령 bash-5.0-alphahistorydelete() 옵션의 범위를 사용합니다 -d. 바라보다Rasta 파일 답변.

이전 버전의 경우 해결 방법은 다음과 같습니다.


당신은 그것을 사용할 수 있습니다history -d offset내장 명령은 현재 셸 기록에서 특정 줄을 제거하거나 history -c전체 기록을 지웁니다.

행 범위를 삭제하려는 경우 오프셋만 인수로 사용하므로 실용적이지 않지만 루프를 사용하여 함수로 래핑할 수 있습니다.

rmhist() {
    start=$1
    end=$2
    count=$(( end - start ))
    while [ $count -ge 0 ] ; do
        history -d $start
        ((count--))
    done
}

이라고 부르곤 했어요 rmhist first_line_to_delete last_line_to_delete. (출력된 라인 번호를 기준으로 합니다 history.)

( history -w히스토리 파일을 강제로 쓰기 위해 사용됩니다.)

답변3

~에 따르면매뉴얼 페이지스매시 5.xhistory내장 명령도 이제 범위를 사용합니다.

-d offset

    이 위치의 기록 삭제offset. 만약에offset음수이면 마지막 과거 위치보다 큰 인덱스 1을 기준으로 해석되므로 음수 인덱스는 기록 끝에서 카운트다운되고 인덱스 -1은 현재를 나타냅니다.history -d주문하다.

-d start-end

    직위 간 기록 삭제start그리고end, 포함됩니다. 양수 및 음수 값start그리고end설명은 위와 같습니다.

그러나 history --help현재(v5.2.21 기준) 이는 반영되지 않습니다.

 Options:
   -c        clear the history list by deleting all of the entries
   -d offset delete the history entry at position OFFSET. Negative
             offsets count back from the end of the history list
 
   -a        append history lines from this session to the history file
   ...

예를 들어 history -d 2031-2034한 번에 4개의 행을 삭제합니다. 다음을 사용하여 $HISTCMD최신 행부터 삭제할 수 있습니다 .질소뒤로 줄을 긋습니다.


내보내기를 사용한 history -w tmpfile다음 파일을 편집하고, 지우기를 사용한 history -c다음 다시 읽기를 사용할 수도 있습니다 history -r tmpfile. (직접) 편지를 쓸 필요가 없습니다 .bash_history.

답변4

arg는 history -d범위를 허용하며 $HISTCMD역사상 가장 큰 숫자입니다.

이 함수는 기록에서 마지막 항목을 제거하는 데 사용됩니다 n(제거할 기록 명령 수를 전달하면 됩니다. 예 rmhist 5:

$ rmhist()  { history -d $(($HISTCMD - $1))-$HISTCMD ;}

또는..이력(포함) 또는 마지막 '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

관련 정보