コマンドが続きます
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スクリプトを書いて履歴の削除を実行できますか?
履歴ファイルを直接編集してみましたか。
~/.bash_history
私の答えは前の答えに基づいていますが、履歴項目が最新のものから最新のものへと削除されるように順序を逆にすることを追加しています。
現在の履歴を取得します(見たい行数を調整します)。
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
を使うだけです。
for x in `seq $1 $2`
do
history -d $1
done
上からの答えを組み合わせる:
history -w vi ~/.bash_history history -r
まず、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
括弧付きイテレータを変更しました。また、この関数をリバースイテレータで呼び出します。
あなたはおそらくこのようなことをすることができます:
#!/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
境界のチェックインにエラーを入れていないことに注意してください。私はそれを読者への課題として残します。
また参照してください この質問
たぶん誰かに役立つでしょう。
あなたが現在のセッションの任意のコンソール/端末履歴の任意のユーザにログインすると、あなたのログアウトで〜/ .bash_historyにフラッシュするいくつかの "バッファ"にのみ存在します。
それで、物事を秘密にしておくためにあなたはただできる:history -r && exit
あなたはあなたのセッションの(そして唯一の)履歴をすべてクリアした状態でログアウトされます;)
Bash 5を使えば、範囲を変更できます。
history -d 511-520
または逆方向に数える10:
history -d -10--1
'歴史'
オプションが提供されている場合、その意味は次のとおりです。
'-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
このスレッドで共有されているソリューションの組み合わせを使用して、コマンド履歴のトレースを消去しました。まず、コマンド履歴の保存場所を確認しました。
echo $HISTFILE
私は歴史を次のように編集しました。
vi <pathToFile>
その後、現在のセッション履歴バッファを次のようにフラッシュします。
history -r && exit
次回このセッションに入るとき、コマンド履歴に表示される最後のコマンドは、最後に残ったものですpathToFile。
history -cはすべての履歴を消去します。
私はこのスクリプトを使って歴史の中の最後の10個のコマンドを削除します。
pos=$HISTCMD; start=$(( $pos-11 )); end=$(( $pos-1 )); for i in $(eval echo "{${start}..${end}}"); do history -d $start; done
履歴インデックスを取得するために$HISTCMD
環境変数を使用し、history
内の最後の10エントリを削除するためにそれを使用します。
以下を試してください。
for i in {511..520}; do history -d $i; echo "history -d $i"; done
単純な関数では数ですべてを殺すことができます(ただしエラー時には無視されます)。
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`
私はこれを使用します(私は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項目を削除します。
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に変更してください。