web-dev-qa-db-ja.com

シェルの最後の10個のコマンドの履歴を削除するにはどうすればいいですか?

コマンドが続きます

  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個のコマンド履歴の中から1個のコマンドをシェルで削除するにはどうすればいいですか?

Bashスクリプトを書いて履歴の削除を実行できますか?

111
Justin John

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

~/.bash_history
100

私の答えは前の答えに基づいていますが、履歴項目が最新のものから最新のものへと削除されるように順序を逆にすることを追加しています。

現在の履歴を取得します(見たい行数を調整します)。

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 | tac); do history -d $h; done

これは1008そして1007そして1006のhistory -dコマンドを生成します。

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

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

history 1 | awk '{print $1}'

まとめると、これを使って範囲を削除したり、history deleteコマンドを削除したりできます。

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

これをすべて~/.bashrcに追加する関数にラップしてください。

histdel(){
  for h in $(seq $1 $2 | tac); do
    history -d $h
  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を使うだけです。

54
JGC
for x in `seq $1 $2`
do
  history -d $1
done
28
Barmar

上からの答えを組み合わせる:

history -w vi ~/.bash_history history -r

14

まず、historyと入力して、削除する行番号のシーケンスを書き留めます。

行1800から1815までの行を消去するには、次のように端末に書き込みます。

$ for line in $(seq 1800 1815) ; do history -d 1800; done

削除コマンドの履歴を削除したい場合は、1815 = 1816に+1を加え、そのシーケンスの履歴+削除コマンドを削除します。

例えば ​​:

$ for line in $(seq 1800 1816) ; do history -d 1800; done
10
Ghassan Zein

編集:

括弧付きイテレータを変更しました。また、この関数をリバースイテレータで呼び出します。

あなたはおそらくこのようなことをすることができます:

#!/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

境界のチェックインにエラーを入れていないことに注意してください。私はそれを読者への課題として残します。

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

9
Tyler Jandreau

たぶん誰かに役立つでしょう。
あなたが現在のセッションの任意のコンソール/端末履歴の任意のユーザにログインすると、あなたのログアウトで〜/ .bash_historyにフラッシュするいくつかの "バッファ"にのみ存在します。
それで、物事を秘密にしておくためにあなたはただできる:
history -r && exit
あなたはあなたのセッションの(そして唯一の)履歴をすべてクリアした状態でログアウトされます;)

9
Alex

Bash 5を使えば、範囲を変更できます。

history -d 511-520

または逆方向に数える10:

history -d -10--1

Bash 5のmanページからの抜粋

'歴史'

オプションが提供されている場合、その意味は次のとおりです。

'-d OFFSET'位置OFFSETの履歴エントリを削除します。 OFFSETが正の場合は、履歴が表示されたときに表示されるとおりに指定する必要があります。 OFFSETが負の場合は、最後の履歴位置より1大きい位置に相対的なものとして解釈されるため、負のインデックスは履歴の末尾からカウントダウンし、インデックス「-1」は現在の「history -d」コマンドを表します。

'-d START-END'開始位置から終了位置までの履歴エントリを削除します。 STARTとENDの正負の値は、上記のように解釈されます。

これがBash 4のための私の解決策です:

delHistory () {
    count=$(( ${2:-$1} - $1 ))
    while [[ $count -ge 0 ]] ; do
        history -d "$start"
        ((count--))
    done
}

delHistory 511 520
4
David Hatch

このスレッドで共有されているソリューションの組み合わせを使用して、コマンド履歴のトレースを消去しました。まず、コマンド履歴の保存場所を確認しました。

echo $HISTFILE

私は歴史を次のように編集しました。

vi <pathToFile>

その後、現在のセッション履歴バッファを次のようにフラッシュします。

history -r && exit

次回このセッションに入るとき、コマンド履歴に表示される最後のコマンドは、最後に残ったものですpathToFile

3
M. Gleria

history -cはすべての履歴を消去します。

2
user6280539

私はこのスクリプトを使って歴史の中の最後の10個のコマンドを削除します。

pos=$HISTCMD; start=$(( $pos-11 )); end=$(( $pos-1 )); for i in $(eval echo "{${start}..${end}}"); do history -d $start; done

履歴インデックスを取得するために$HISTCMD環境変数を使用し、history内の最後の10エントリを削除するためにそれを使用します。

1
Junaid

以下を試してください。

for i in {511..520}; do history -d $i; echo "history -d $i"; done
0
rb1234

単純な関数では数ですべてを殺すことができます(ただしエラー時には無視されます)。

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`
0
steveo'america

私はこれを使用します(私はbash 4を持っています):

histrm() {
    local num=${1:- 1}
    builtin history -d $(builtin history | sed -rn '$s/^[^[:digit:]]+([[:digit:]]+)[^[:digit:]].*$/\1/p')
    (( num-- )) && $FUNCNAME $num
    builtin history -w
}

builtin historyの部分と最後の-wは有名な 端末間で履歴を共有するためのトリック のバリエーションを用意しているので、この関数はそれらの部分がないと壊れます。彼らは本当のbash history組み込みへの呼び出し(そしてそれを取り巻く私自身のラッパーへの呼び出しではない)を確実にし、エントリーが削除された直後に履歴をHISTFILEに書きます。

ただし、これは「通常の」履歴構成の場合と同じように機能します。

あなたが削除したい最後のエントリの数でそれを呼び出すべきです、例えば:

histrm 10

最後の10項目を削除します。

0
ata
for h in $(seq $(history | tail -1 | awk '{print $1-N}')  $(history | tail -1 | awk '{print $1}') | tac); do history -d $h; done; history -d $(history | tail -1 | awk '{print $1}')

10行削除したい場合は、Nの値を10に変更してください。

0
Wasef Anwar