it-roy-ru.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 командами, используя одну команду в оболочке?

Можем ли мы написать скрипт bash и выполнить его для удаления истории?

107
Justin John

Вы пытались редактировать файл истории напрямую:

~/.bash_history
99
WheretheresaWill

Мой ответ основан на предыдущих ответах, но с добавлением обратной последовательности, чтобы элементы истории удалялись из самых последних в наименее недавние.

Получить текущую историю (отрегулируйте количество строк, которые вы хотите видеть):

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

Это сгенерирует команды history -d для 1008, затем 1007, затем 1006.

Если я также хотел удалить команду удаления истории, то это немного сложнее, потому что вам нужно знать текущую максимальную запись истории.

Вы можете получить это с (может быть лучший способ): 

history 1 | awk '{print $1}'

Собрав его вместе, вы можете использовать это для удаления диапазона, а также для удаления команды удаления истории:

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 [email protected] ~]$ 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 [email protected] ~]$ histdel 1049 1051
[18:21:23 [email protected] ~]$ 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.

51
JGC
for x in `seq $1 $2`
do
  history -d $1
done
27
Barmar

Совмещаем ответы сверху:

history -w vi ~/.bash_history history -r

11
Bryant Bernstein

Сначала введите: history и запишите последовательность номеров строк, которые вы хотите удалить.

Чтобы очистить строки, скажем, от 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
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
и вы выйдете из системы с очищенной историей вашей сессии (и только);)

8
Alex

С Bash 5 вы теперь можете делать диапазон ... Ура!

history -d 511-520

или считая в обратном направлении 10:

history -d -10--1

Отрывок из Страница Bash 5 Man :

«История»

Опции, если они есть, имеют следующие значения:

'-d ОФСЕТ' Удалить запись истории в положении OFFSET. Если OFFSET - это положительный, он должен быть указан так, как он появляется, когда история отображается. Если OFFSET отрицательный, это интерпретируется как относительный к одному большему, чем предыдущая история положение, поэтому отрицательные индексы отсчитываются от конца история, а индекс «-1» относится к текущей «истории -d 'команда.

'-d START-END' Удалить записи истории между позициями START и END, включительно. Положительные и отрицательные значения для START и END интерпретируется как описано выше.

Вот мое решение для Bash 4:

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

delHistory 511 520
2
David Hatch

история -c очистит все истории.

2
user6280539

Я использовал комбинацию решений, используемых в этой теме, чтобы стереть трассировку в истории команд. Во-первых, я проверил, где хранится история команд с:

echo $HISTFILE

Я редактировал историю с:

vi <pathToFile>

После этого я очищаю буфер истории текущей сессии:

history -r && exit

В следующий раз, когда вы войдете в этот сеанс, последняя команда, которую вы увидите в истории команд, будет последней, которую вы оставили в pathToFile

1
M. Gleria

Я использую этот скрипт, чтобы удалить последние 10 команд в истории:

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

Он использует среду $HISTCMD var для получения индекса истории и использует его для удаления последних 10 записей в history.

1
Junaid

Попробуйте следующее:

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

Простая функция может убить всех по номеру (хотя она и ошибается)

kill_hist() {
    for i in $(echo [email protected] | 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