Удалить последние N строк из истории Bash

40

Случайно вставляя файл в оболочку, он добавляет кучу безобразных бессмысленных записей в историю bash. Есть ли чистый способ удалить эти записи? Очевидно, что я мог бы закрыть оболочку и отредактировать .bash_historyфайл вручную, но, может быть, есть какой-то API, доступный для изменения истории текущей оболочки?

ThiefMaster
источник

Ответы:

36

Вы можете использовать history -d offsetвстроенную функцию, чтобы удалить конкретную строку из истории текущей оболочки или history -cочистить всю историю.

Это не очень удобно, если вы хотите удалить диапазон строк, поскольку в качестве аргумента требуется только одно смещение, но вы можете заключить его в функцию с помощью цикла.

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

Назовите его rmhist first_line_to_delete last_line_to_delete. (Номера строк в соответствии с выводом history.)

(Используйте history -wдля принудительной записи в файл истории.)

Мат
источник
1
Так как ОП попросил удалить N последних строк, этот скрипт следует изменить, выполнив что-то вроде:, tot_lines=$(history | wc -l)а затем повторить history -d $(( tot_lines - $1 )).
PlasmaBinturong
2
Вместо этого $(history | wc -l)есть переменная, $HISTCMDкоторую можно использовать.
PlasmaBinturong
29

Только этот вкладыш в командной строке поможет.

for i in {1..N}; do history -d START_NUM; done

Где START_NUM - начальная позиция в истории. N - количество записей, которые вы можете удалить.

например: for i in {1..50}; do history -d 1030; done

user2982704
источник
3
Интересно, почему это уже не встроенная функция? «История» - очень старый инструмент.
Петр Гладких
служит цели очень хорошо, но эту команду можно увидеть в истории :)
Раджив Акоткар
askubuntu.com/a/978276/22866 имеет хороший способ удалить «команду удаления из истории» из истории :-)
HanSooloo
0

Ответ от пользователя 2982704 почти работал для меня, но не совсем. Я должен был сделать небольшое изменение, как это.

Предполагая, что моя история на 1000, и я хочу удалить последние 50 записей

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
aberpaul
источник