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

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

문자열과 일치하는 모든 명령을 기록에서 삭제해야 합니다. 나는 시도했다:

$ 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)

이를 수행하는 올바른 방법은 무엇입니까?

답변1

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

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

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

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

답변2

현재 세션에서 명령 제거에 신경 쓰지 않는다면 Michael Mrozek의 답변이 작동합니다. 이렇게 하려면 해당 게시물에서 작업을 수행하기 전에 기록 파일에 기록해야 합니다 history -a.

또는 기록 파일에서 필요한 항목을 삭제한 후 history -c이슈별로 다시 로드한 다음 history -r.

답변3

한 줄짜리를 찾는 사람들을 위해:

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

예를 들어 원하는 경우. 비밀번호가 포함된 여러 줄을 삭제하고 "SEARCH_STRING_GOES_HERE"를 비밀번호로 바꾸세요. 그러면 해당 검색 문자열에 대한 전체 기록을 검색하여 삭제합니다.

주의할 점 2가지

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

답변4

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

이것은 나에게 효과적입니다. History-c && History-a가 기록 파일을 올바르게 다시 로드하지 않았습니다. 그래서 메모리 내 파일이 덮어쓰지 않도록 히스토리 파일을 다시 쓴 후 바로 세션을 종료합니다.

관련 정보