Команды следует
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
Я могу удалить один история -д 511, но как удалить последние 10 команд и в период с 10 по истории команд с помощью одной команды в Shell?
Можно написать 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 затем затем.
Если я хочу удалить историю команды delete потом он'ы немного сложнее, так как нужно знать текущую запись максимум истории.
Вы можете сделать это с (их может быть лучший способ):
history 1 | awk '{print $1}'
Поставив его вместе, вы можете использовать это, чтобы удалить диапазон, а также удалить историю команды 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
.
Сочетая ответы сверху:
история -з ви ~/.bash_history история -Р`
Во-первых, типа: "история" и запишите последовательность чисел линий, которые вы хотите удалить.
Чтобы очистить линии от Let'ы сказать, линия 1800 до 1815 написать следующие команды в терминале:
$ for line in $(seq 1800 1815) ; do history -d 1800; done
Если вы хотите, чтобы удалить историю для удаления команды, добавить +1 за 1815 = 1816 и истории для этой последовательности + удаление команды будут удалены.
Например :
$ 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 на свой выход. Поэтому, чтобы держать вещи в секрете вы можете просто: история -R &ампер;&ампер; выход` и вы будете авторизованы все ваши сессии's (и только) истории снят ;)
С bash 5 Теперь можно сделать целый ряд...Ура!:
history -d 511-520
или обратный счет 10:
history -d -10--1
Выдержка из Баш 5 Страница:
'история'
варианты, если он входит в комплект, имеют следующие значения:
'-d смещение' удалить запись истории в позиции смещения. Если смещение положительно, он должен быть указан как кажется, когда отображается история. Если смещение отрицательно, это интерпретируется как относительно один больше, чем последний истории позиция, столь негативные показатели отсчитать назад от конца В истории, а индекс '-1' относится к текущему 'история -д' команда.
'-д-начало-конец' удалить записи истории между стартовыми позициями и конец, включительно. Положительные и отрицательные значения для начала и конца интерпретируется как описано выше.
Вот мое решение для 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.
история -C будет очистить все истории.
Попробуйте следующее:
for i in {511..520}; do history -d $i; echo "history -d $i"; done
Я использую этот скрипт, чтобы удалить последние 10 команд в истории:
pos=$HISTCMD; start=$(( $pos-11 )); end=$(( $pos-1 )); for i in $(eval echo "{${start}..${end}}"); do history -d $start; done
Он использует $HISTCMD
окружения VAR для получения индекса историю и использует для того, чтобы удалить последние 10 записей в "истории".
Я использую этот (у меня Бэш 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
}
На встроенной части, а также в последний -З
- это потому что у меня в место вариацией знаменитого уловки, чтобы поделиться историей через терминалы, и эта функция будет ломать без этих частей. Они обеспечивают вызов встроенной реальный Баш "история" (а не моя собственная обертка вокруг него), и написать историю для 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.
Простая функция может убить всех по количеству (хотя она облевала ошибки)
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`
чтобы удалить последние 10 записей (на вашем примере) :
history -d 511 520