指定された文字列に一致するコマンドを履歴から削除するには?

指定された文字列に一致するコマンドを履歴から削除するには?

文字列に一致するすべてのコマンドを履歴から削除する必要があります。私は試した:

$ 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)でのみ機能します。ファイルから行を削除すると、はるかに簡単になります。これはいくつかの方法で行うことができます。grep1つの方法ですが、ファイルの読み込み中にファイルを上書きしないように注意する必要があります。

$ 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 は履歴ファイルを正しく再ロードしませんでした。そのため、メモリ内のファイルが上書きされないように履歴ファイルを書き換えた直後にセッションを終了します。

関連情報