주어진 문자열과 일치하는 기록에서 명령을 삭제하는 방법은 무엇입니까?


13

내 기록에서 문자열과 일치하는 모든 명령을 삭제해야합니다. 난 노력 했어:

$ history | grep searchstring | cut -d" " -f2 | history -d
-bash: history: -d: option requires an argument

$ history | grep searchstring | cut -d" " -f2 | xargs history -d
xargs: history: No such file or directory

$ temparg() { while read i; do "$@" "$i"; done }
$ history | grep searchstring | cut -d" " -f2 | temparg history -d
(no error, but nothing is deleted)

이것을하는 올바른 방법은 무엇입니까?


아래에 작업 답변이 있지만 여전히 작동하지 않는 이유가 궁금합니다 history -d X. 방금했기 때문에이 질문을 보았습니다 history | grep search_str | sort -nr | awk '{print $1}' | while read i; do history -d $i; done. 오류는 없지만 아무것도 삭제되지 않았습니다. 아무도 이유를 설명 할 수 있습니까?
mivk 2016 년

답변:


18

history명령은 히스토리 파일 $HISTFILE(일반적으로 ~/.history또는 ~/.bash_history) 에서만 작동합니다 . 파일에서 행을 제거하면 여러 가지 방법으로 훨씬 쉽게 수행 할 수 있습니다. grep한 가지 방법이지만 파일을 읽는 동안 파일을 덮어 쓰지 않도록주의해야합니다.

$ grep -v searchstring "$HISTFILE" > /tmp/history
$ mv /tmp/history "$HISTFILE"

다른 방법은 다음과 sed같습니다.

$ sed -i '/searchstring/d' "$HISTFILE"

좋은 답변; $HISTFILE아마 인용 할 가치가있는 공백을 포함 할 수 있습니다.
Chris Down

조심하십시오 ... histfile은 예측할 수 없습니다. 열려있는 껍질이 많으면 정확히 무엇이 저장되고 어떤 순서로 저장되는지 알 수 없습니다. 이미 열려있는 쉘이 닫힐 때 초기화시로드 된 기록을 다시 쓰지 않을 것임을 누구든지 확인할 수 있습니까?
오리온

8

현재 세션에서 명령을 제거하지 않아도 Michael Mrozek의 답변이 효과가 있습니다. 그럴 경우, 자신의 게시물에서 작업을 수행하기 전에 작업 내역 파일에 기록해야합니다 history -a.

당신이 당신의 기록 파일에서 원하는 항목을 제거한 후 또한, 당신은 실행하여 그것을 다시로드 할 수 있습니다 history -chistory -r.


2

MichaelChris의 답변을 바탕으로 다음을 생각해 냈습니다. ~/.bashrc파일에 파일 을 추가 한 다음 . ~/.bashrc또는 로로드하십시오 source ~/.bashrc.

:<<COMMENT
    Deletes all lines from the history that match a search string, with a
    prompt. The history file is then reloaded into memory.

    Examples
        hxf "rm -rf"
        hxf ^source

    See:
    - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string
COMMENT
#The unalias prevents odd errors when calling". ~/.bashrc" (May result in
#"not found" errors. That's okay).
unalias hxf
hxf()  {
    read -r -p "About to delete all items from history that match \"$1\". Are you sure? [y/N] " response
    response=${response,,}    # tolower
    if [[ $response =~ ^(yes|y)$ ]]
    then
        #Delete all matched items from the file, and duplicate it to a temp
        #location.
        echo -e "grep -v \"$1\" \"$HISTFILE\" > /tmp/history"
        grep -v "$1" "$HISTFILE" > /tmp/history

        #Clear all items in the current sessions history (in memory). This
        #empties out $HISTFILE.
        echo "history -c"
        history -c

        #Overwrite the actual history file with the temp one.
        echo -e "mv /tmp/history \"$HISTFILE\""
        mv /tmp/history "$HISTFILE"

        #Now reload it.
        echo -e "history -r \"$HISTFILE\""
        history -r "$HISTFILE"     #Alternative: exec bash
    else
        echo "Cancelled."
    fi
}

2

하나의 라이너를 찾는 사람들을 위해 :

while history -d $(history | grep 'SEARCH_STRING_GOES_HERE'| head -n 1 | awk {'print $1'}) ; do :; history -w; done

예를 들어서 비밀번호가있는 여러 줄을 삭제하려면 "SEARCH_STRING_GOES_HERE"를 비밀번호로 바꾸십시오. 해당 검색 문자열에 대한 전체 내역을 검색하여 삭제합니다.

알아야 할 2 가지

  • grep은 인수로 -F를 제공하지 않으면 정규식을 사용합니다.
  • 더 이상 일치하는 항목이 없으면 명령에 1 오류가 표시됩니다. 무시해.

오류가 발생했습니다 (-bash : history : -d : 옵션에 인수가 필요함). 그래도 작동합니까?
paradroid

삭제할 명령이 없기 때문에 오류와 함께 실패 할 때까지 delete 명령을 계속 실행합니다. 오류를 무시하십시오.
thelogix

1
cat "$HISTFILE" | grep -v "commandToDelete" >> "$HISTFILE" && exit

이것은 나를 위해 일했습니다. history -c && history -a 이력 파일을 제대로 다시로드하지 못했습니다. 대신 메모리에서 기록 파일을 덮어 쓰지 않도록 기록 파일을 다시 작성한 직후 세션을 종료합니다.

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