Como excluir comandos no histórico que correspondem a uma determinada string?

12

Preciso excluir todos os comandos do meu histórico que correspondem a uma string. Eu tentei:

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

Qual é o caminho certo para fazer isso?

    
por linuxfix 07.12.2012 / 21:12

5 respostas

17

O comando history apenas funciona no seu arquivo de histórico, $HISTFILE (geralmente ~/.history ou ~/.bash_history ). Será muito mais fácil se você simplesmente remover as linhas desse arquivo, o que pode ser feito de várias maneiras. grep é unidirecional, mas você deve ter cuidado para não sobrescrever o arquivo enquanto o lê:

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

Outra maneira é com sed :

$ sed -i '/searchstring/d' "$HISTFILE"
    
por 07.12.2012 / 21:43
7

A resposta de Michael Mrozek funcionará se você não se importar em remover comandos da sessão atual. Se você fizer isso, você deve gravar no arquivo de histórico antes de fazer as operações em sua publicação fazendo history -a .

Além disso, depois de remover as entradas desejadas do arquivo do histórico, você pode recarregá-las emitindo history -c e, em seguida, history -r .

    
por 07.12.2012 / 21:52
2

Baseado em Michael e Chris ' responde, eu vim com o seguinte. Adicione-o ao seu arquivo ~/.bashrc e, em seguida, carregue-o com . ~/.bashrc ou 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
}
    
por 13.01.2015 / 17:51
1
cat "$HISTFILE" | grep -v "commandToDelete" >> "$HISTFILE" && exit

Isso funcionou para mim. história -c & & history -a não recarregou o arquivo de histórico corretamente para mim. Então, ao invés disso, eu apenas saio da minha sessão logo após reescrever o arquivo de histórico, então o que está na memória não o sobrescreve.

    
por 01.11.2017 / 14:05
0

Para quem procura um verso:

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

Então, se você quisesse, por exemplo. Para excluir várias linhas com uma senha, basta substituir "SEARCH_STRING_GOES_HERE" pela senha. Isso pesquisará todo o histórico dessa string de pesquisa e a excluirá.

2 coisas a ter em conta

  • o grep usa o regex, a menos que você forneça -F como um argumento
  • O comando mostrará 1 erro, uma vez que não há mais correspondências. Ignore isso.
por 22.07.2015 / 22:53