168

コマンドは次のとおりです

  511  clear
  512  history
  513  history -d 505
  514  history
  515  history -d 507 510 513
  516  history
  517  history -d 509
  518  history
  519  history -d 511
  520  history

で単一history -d 511のコマンドを削除できますが、シェルで単一のコマンドを使用して最後の 10 コマンドと 10 コマンド間の履歴を削除するにはどうすればよいですか?

履歴を削除するために bash スクリプトを作成して実行できますか?

4

20 に答える 20

122

履歴ファイルを直接編集してみましたか?

~/.bash_history
于 2013-02-07T12:07:37.050 に答える
102

私の答えは以前の答えに基づいていますが、シーケンスを逆にして、履歴項目が最新のものから最も古いものへと削除されるようにしています。

現在の履歴を取得します (表示する行数を調整します):

history | tail -n 10

これは私に次のようなものを与えます

1003  25-04-2016 17:54:52 echo "Command 1"
1004  25-04-2016 17:54:54 echo "Command 2"
1005  25-04-2016 17:54:57 echo "Command 3"
1006  25-04-2016 17:54:59 echo "Command 4"
1007  25-04-2016 17:55:01 echo "Command 5"
1008  25-04-2016 17:55:03 echo "Command 6"
1009  25-04-2016 17:55:07 echo "Command 7"
1010  25-04-2016 17:55:09 echo "Command 8"
1011  25-04-2016 17:55:11 echo "Command 9"
1012  25-04-2016 17:55:14 echo "Command 10"

削除するアイテムの開始位置と終了位置を選択します。エントリ1006から1008を削除します。

for h in $(seq 1006 1008); do history -d 1006; done

これにより、1006 のコマンドが生成さhistory -dれ、1007 が 1006 になり、1006 が削除され、1008 (1007 になった) が 1006 になり、削除されます。

history delete コマンドも削除したい場合は、現在の最大履歴エントリを知る必要があるため、少し複雑になります。

これを取得できます(もっと良い方法があるかもしれません):

history 1 | awk '{print $1}'

まとめると、これを使用して範囲を削除し、履歴削除コマンドも削除できます。

for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')

これをすべて関数にまとめて、に追加します~/.bashrc

histdel(){
  for h in $(seq $1 $2); do
    history -d $1
  done
  history -d $(history 1 | awk '{print $1}')
  }

コマンド 4、5、および 6 (1049-1051) を削除し、証拠を非表示にする例:

[18:21:02 jonathag@gb-slo-svb-0221 ~]$ history 11
 1046  25-04-2016 18:20:47 echo "Command 1"
 1047  25-04-2016 18:20:48 echo "Command 2"
 1048  25-04-2016 18:20:50 echo "Command 3"
 1049  25-04-2016 18:20:51 echo "Command 4"
 1050  25-04-2016 18:20:53 echo "Command 5"
 1051  25-04-2016 18:20:54 echo "Command 6"
 1052  25-04-2016 18:20:56 echo "Command 7"
 1053  25-04-2016 18:20:57 echo "Command 8"
 1054  25-04-2016 18:21:00 echo "Command 9"
 1055  25-04-2016 18:21:02 echo "Command 10"
 1056  25-04-2016 18:21:07 history 11
[18:21:07 jonathag@gb-slo-svb-0221 ~]$ histdel 1049 1051
[18:21:23 jonathag@gb-slo-svb-0221 ~]$ history 8
 1046  25-04-2016 18:20:47 echo "Command 1"
 1047  25-04-2016 18:20:48 echo "Command 2"
 1048  25-04-2016 18:20:50 echo "Command 3"
 1049  25-04-2016 18:20:56 echo "Command 7"
 1050  25-04-2016 18:20:57 echo "Command 8"
 1051  25-04-2016 18:21:00 echo "Command 9"
 1052  25-04-2016 18:21:02 echo "Command 10"
 1053  25-04-2016 18:21:07 history 11

問題は、実際には履歴から最後の 10 個のコマンドを削除することでした。そのため、少しの労力を節約したい場合は、別の関数を使用histdelして、計算を行う関数を呼び出すことができます。

histdeln(){

  # Get the current history number
  n=$(history 1 | awk '{print $1}')

  # Call histdel with the appropriate range
  histdel $(( $n - $1 )) $(( $n - 1 ))
  }

この関数は、削除する以前の履歴アイテムの数である 1 つの引数を取ります。したがって、履歴から最後の 10 個のコマンドを削除するには、単にhistdeln 10.

于 2016-04-25T17:26:06.400 に答える
31
for x in `seq $1 $2`
do
  history -d $1
done
于 2013-02-07T12:14:07.517 に答える
19

上記の回答を組み合わせる:

history -w vi ~/.bash_history history -r

于 2017-09-21T03:57:31.633 に答える
9

編集:

ブレース付きイテレータを変更しました。また、この関数を逆反復子で呼び出します。

おそらく次のようなことができます:

#!/bin/bash
HISTFILE=~/.bash_history   # if you are running it in a 
                           # non interactive shell history would not work else
set -o history
for i in `seq $1 $2`;
do
    history -d $i
done
history -w

このように呼び出す場所:

./nameOfYourScript 563 514

境界のエラー チェックを入れていないことに注意してください。それは読者への演習として残しておきます。

この質問も参照してください

于 2013-02-07T12:10:25.430 に答える
1

history -c はすべての履歴をクリアします。

于 2016-05-02T09:20:42.220 に答える
0

単純な関数は、番号ですべてを殺すことができます (ただし、エラーにはバーフします)。

kill_hist() {
    for i in $(echo $@ | sed -e 's/ /\n/g;' | sort -rn | sed -e 's/\n/ /;')
    do
            history -d $i;
    done
}
kill_hist `seq 511 520`
# or kill a few ranges
kill_hist `seq 1001 1010` `seq 1200 1201`
于 2017-05-31T22:34:19.593 に答える