選択した結果をbash履歴から削除する方法は?


66

historyコマンドはすべての結果を表示しますが、を使用して特定のコマンドを取得するためにフィルタリングできますhistory | grep searchingCommand。本当に助かります。

しかし問題は、タイプミスで入力されたコマンドや失敗したコマンドも表示することです。正しいものを特定することは本当に苦痛です。私はこのリンクをチェックしました:ターミナルの選択的なコマンド履歴?しかし、それは私の解決策ではありませんでした。

では、入力された時点以降で誤っていたコマンドを履歴から削除する方法はありますか?


5
承認済みの回答を変更してください。100以上の賛成票を持つ他の回答があります。
グルーズ

1
@greuze:ベストアンサーに変更されました。票の数は、それが最高だという意味ではありません!
Sauravクマール

回答:


20

履歴エントリを変更(または削除)する別の方法を追加したいのですが、bashを使用していたときに偶然見つけました。

これを実証するには、bashで次の3つのコマンドを実行することから始めます。

$ echo 1
1
$ echo 2
2
$ echo 3
3

矢印キーまたはCtrl+ pおよびCtrl+ を使用して、これらのコマンドを再度選択できるようになりましたn

最初の2つのコマンドを変更するとします。echo 1が表示されるまで履歴を移動し、に変更しますがecho 1 - changed、Enterキーを押さないでください。履歴をさらに移動すると、この行は変更された状態のままで、そこから離れたり戻ったりすることができます。行に移動してにecho 2変更しecho 2 - changed、再度Enterキーを押さないでください。これらの行への変更を保存するには、これらの2つを除く履歴のコマンドを選択し、Ctrl+を押しcます。

もちろん、履歴エントリを変更する代わりに、履歴エントリを削除することもできます。これにより、そのエントリに空の行ができます。現在プロンプトに表示されている行を削除するには、Ctrl+ e(行の末尾にジャンプ)を押してからCtrl+ u(行の先頭からカーソルまでのテキストを削除)を押します。

参照してくださいhttps://unix.stackexchange.com/questions/195668/what-c​​an-cause-an-item-to-be-deleted-from-my-bash-history/195726#195726のより詳細な説明のために技術的背景。

最も簡単な方法:

  1. ctrl+ r削除/変更するコマンドを検索します。
  2. end 検索されたコマンドを選択して削除/変更する
  3. 選択したコマンドを削除または変更します(enterまたはctrl+を押さないでくださいc
  4. 他のコマンドを選択するには、上矢印(またはctrl+ p)または下矢印(またはctrl+ n)を使用します。
  5. ctrl+ c それだけです!

これにより、現在のセッションコマンドのみが変更されます。古いコマンドを変更して変更を保存する場合は、ターミナルを閉じる前に次のコマンドを実行する必要があります。

history -w

ステファンに感謝します!あなたは素晴らしいものを持ってきたと言わなければなりません。これを使用して、履歴を変更/削除する最も簡単な方法を見つけました。1ctrl+r。削除/変更するコマンドを検索します。2.endコマンドを移動し、コマンドを削除/変更します。3.ctrl+n次の行に移動し、次に 4.ctrl+c
Saurav Kumar

144

つかいます:

history -d OFFSET

OFFSETbash履歴ファイルに追加される前でも、オフセットで履歴エントリを削除します。正しいを見つけるにはOFFSEThistoryコマンドを実行するだけです。削除する履歴エントリを含む行の先頭からの番号です。

履歴の変更を保存するには、次を使用します。

history -w

このガイドの詳細を参照してください


悪くない:)新しい方法を得るのに良い..
Saurav Kumar 14

10
@SauravKumar悪くない?!?おそらく最良の方法は...ある
ラドゥRădeanu

5
最初にお読みください:明確にhistory -wするために、変更を保存するためにあとがきをする必要があります。また、OFFSETは、history表示される番号を意味します。削除しようとしている行が873である場合は、を使用しますhistory -d 873
Cammy_the_block 14

2
@RaduRădeanuafterを使用history -whistory -dて変更を保存します。
Cammy_the_block 14

20
これが正解です。
トファー

19

ファイル~/.bash_historyを編集し、タイプミスで1回削除します

たとえば、次のコマンドを挿入します。

gedit ~/.bash_history

ファイルを保存してターミナルを再起動するよりも、好きなものを編集してください。rootコマンドは次のとおりです。

sudo -i 
inser your password
gedit ~/.bash_history

すべてを削除するhistory -c場合は、トリックを行う必要があります


構文

history
history [n]
history -c
history -d offset
history [-anrw] [filename]
history -ps arg

キー

-c履歴リストをクリアします。これを他のオプションと組み合わせて、履歴リストを完全に置き換えることができます。

-d offset位置offsetの履歴エントリを削除します。履歴を表示するときに表示されるオフセットを指定する必要があります。

-a新しい履歴行(現在のBashセッションの開始以降に入力された履歴行)を履歴ファイルに追加します。

-n履歴ファイルからまだ読み込まれていない履歴行を現在の履歴リストに追加します。これらは、現在のBashセッションの開始以降に履歴ファイルに追加される行です。

-r現在の履歴ファイルを読み取り、その内容を履歴リストに追加します。

-w現在の履歴を履歴ファイルに書き出します。

-p argsで履歴置換を実行し、結果を履歴リストに保存せずに結果を標準出力に表示します。

-s引数は、単一のエントリとして履歴リストの最後に追加されます。

ソース


役に立った!コマンドラインから入力したときにエントリを削除する方法を知っていますか?または、を開かずにエントリを削除するコマンドはあります.bash_historyか?
Saurav Kumar

1
history -cターミナルを閉じて再度開くと、@ bladed19899 が機能しません。履歴は削除されません。-1あなたの答え
αғsнιη

1
@KasiyA、-c Clear the history list. This may be combined with the other options to replace the history list completely. ソース
blade19899 14年

2
使用@KasiyA history -w後にhistory -c変更を書き込み。
Cammy_the_block 14

16

同じ端末からすぐに削除したい場合は、〜/ .bashrcファイルに次を追加する必要があります。

PROMPT_COMMAND='history -a' 

ターミナルを再起動します。

.bashrcファイルのどこにでも追加できます。以下のように、他の履歴関連のものとともに追加しました。

ここに画像の説明を入力してください

通常、bashセッション中、実行されたコマンドは、セッションが終了するまで.bash_historyに書き込まれません。したがってPROMPT_COMMAND='history -a'、コマンドを.bash_historyに入力します。

これで、コマンドに間違いやエラーを犯し、それを削除したいときはいつでも、次を実行するだけです

sed -i '$d' ~/.bash_history

多田は削除されます。

それをよりシンプルにするために、よりシンプルなものにエイリアスして、次のように使用できます。

alias rh ='sed -i '\''$d'\'' ~/.bash_history'

したがって、実行するrhと、最後に実行されたコマンドが履歴から削除されます。

上記は一時的なエイリアシングであり、セッションの間のみ持続します。永続的または永続的に追加するには

alias rh = 'sed -i '\''$d'\'' ~/.bash_history' 

.bashrcへ

注意

両側にスペースがあってはいけません =

エイリアスにしたくない場合は、次のこともできます

コンマ名rhを作成して、/binディレクトリに配置します。

  • ファイルを開いてrh次のコードを貼り付け、保存して閉じます:

    sed -i '$d' ~/.bash_history

  • 作成しrh、実行し、それを置く/binディレクトリ:

     chmod + x rh
     sudo cp rh / bin 
  • rhコマンドを使用して、履歴から最近のコマンドを削除します。


ファイルをどこに追加PROMPT_COMMAND='history -a'.bashrcますか?そして、それは正確に何をしますか?私はsed -i '$d' ~/.bash_historyそれが編集せずに動作するようにしてみました.bashrc!! しかし、別名ものが動作していないあなただけの私の質問を詳しく説明し、別名作業を行う場合..私はあなたの答えを受け入れるだろう... :)
Sauravクマール

@SauravKumarが回答を編集しました。エイリアスコマンドで一重引用符と二重引用符を忘れていた..私の悪い..:P
Stormvirux

信じられないかもしれません。エイリアスはまだ機能していません。エラーなしで実行されますが、.bash_historyファイルからエントリは削除されません。:P何らかの方法で。/binディレクトリ。あなたのコマンドのため: sed -i "$d" ~/.bash_historyそれはうまく機能しています。私はあなたの答えを受け入れます.. :)
サウラヴクマール

気にしない場合は、他の人に役立つように回答を編集したいと思います。
SauravKumar

実際に編集しました。あなたはそれを承認しました...
Sauravクマール

2

複数の行を削除するには(たとえば、1974年から1990年まで、historyコマンドで確認してください):

  for i in `seq 1974 1990` ; do history -d 1974 ; done

削除する行番号は常に同じであることに注意してください。これは、その行番号を絶えず削除してから次の行に進むためです。


メモは非常に重要です。
ウェイジュン周

1

bashで「set -o vi」オプションを使用している場合(エスケープキーで検索するのに非常に便利です)、「vi」で行うのと同じ方法で行を検索し、「dd」で行を削除できます。


私は私が入力する必要があることを見つけるjk後にdd、それは実際に履歴からコマンドをクリアにします。別のコマンドを入力するか、単にを押すとEnter、bashはそれが単なる新しいコマンドであり、古いコマンドを履歴に保持するものと想定しているようです。また、適切に実行されると、コマンドはクリアされますが削除されないことに注意してください。結果は空白の履歴エントリになります。しかし、これはコマンドラインで入力するように強制されたパスワードを削除するのに十分であり、他の回答よりもはるかに簡単なので、これを投稿してくれてありがとう!
マイケルシェパー

0

Yubikeyからのbash履歴に余分なエントリがあり、「ccccc .....」と一致する場合があります。理想的には、パターンに一致するエントリを削除する方法が必要でした。これは、履歴が空白を無視すると仮定して、sedなどで実行できると思います。

とにかく、私は怠け者になり、vimを使用し、「cccc」を検索し、すべての試合をサイクリングするときに「dd」を使用することになりました。1分もかかりませんでした。


1
vimでこれを行っている場合は、:g / cccc / dまたは:g / ^ cccc / d:を実行するか、マクロqqnddqを使用してから@@を実行することもできます(最後の検索はcccccであると想定)。
htaccess

@htaccessこれは確かに簡単でしたが、ファイルの残りの部分を同時に視覚的に調べたいと思いました。
Dylan_Larkin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.