문자열과 일치하는 모든 명령을 기록에서 삭제해야 합니다. 나는 시도했다:
$ 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가 기록 파일을 올바르게 다시 로드하지 않았습니다. 그래서 메모리 내 파일이 덮어쓰지 않도록 히스토리 파일을 다시 쓴 후 바로 세션을 종료합니다.