Как удалить одну строку из истории?

Ответы:

340

Профилактические меры

Если вы хотите выполнить команду, не сохраняя ее в истории, добавьте ее с дополнительным пробелом

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space

Чтобы это работало, вам нужно либо в, ignorespaceлибо ignorebothв HISTCONTROL. Например, запустить

HISTCONTROL=ignorespace

Чтобы сделать этот параметр постоянным, поместите его в свой .bashrc.

Посмертная уборка

Если вы уже выполнили команду и хотите удалить ее из истории, сначала используйте

history

отобразить список команд в вашей истории. Найдите номер рядом с тем, который вы хотите удалить (например, 1234), и запустите

history -d 1234

Кроме того, если строка, которую вы хотите удалить, уже записана в ваш $ HISTFILE (что обычно происходит, когда вы завершаете сеанс по умолчанию), вам нужно будет выполнить обратную запись в $ HISTFILE, или эта строка появится снова, когда вы откроете новую сессия:

history -w
jw013
источник
Это сработало. Я думаю, что мы должны получить исходный текст ~ / .bashrc после его изменения ...
B 7
3
@ jw013 Я установил PROMPT_COMMAND history -aв этом случае, в этом случае он уже записан в файл истории, а не при выходе при нормальной конфигурации. В частности: mywiki.wooledge.org/BashFAQ/088
Иордания
5
После удаления одной строки вам нужно записать текущую историю в ваш $ HISTFILE, используя history -w. В противном случае при выходе удаленная строка все еще там!
Фелипе Альварес
1
+1 к комментарию выше; использование history -wafter history -d {num}было именно тем, что мне было нужно - этот критический лакомый кусочек должен быть добавлен к ответу, иначе пользователь может подумать, что временное удаление из текущей оболочки на самом деле является постоянным.
Майкл
1
@BobStein history -wнеобходим для записей, которые уже были записаны в .bash_historyфайл. Как воспроизвести (например, на CentOS 7 со стандартной конфигурацией): 1. войдите 2. введите команду echo foo3. выйдите из системы 4. снова войдите в систему 5. удалите запись для echo foo6. выйдите из системы 7. снова войдите в систему: запись все еще там. В зависимости от того, как вы конфигурируете свою историю Bash, возможно, вы можете воспроизвести эту проблему другими способами - например, если вы провоцируете запись истории перед выходом из системы.
maxschlepzig
53
  1. Чтобы очистить всю свою историю, используйте

    history -c
  2. Чтобы удалить одну строку, используйте

    history -d linenumber
soumyaranjan
источник
6

У меня есть это в моем ~/.bashrc, что делает команду $ forgetудалить предыдущую команду из истории

function forget() {                                                              
   history -d $(expr $(history | tail -n 1 | grep -oP '^ \d+') - 1);              
}
Райан Хейнинг
источник
Это кажется немного сложным. Не history -d $( history | tail -n 1 | cut -f 1 -d " " )будет проще?
seumasmac
1
history | tail -n1является самой historyкомандой, поэтому удаление этого номера приводит к неправильной записи. Тем не менее, history -d $( history | awk 'END{print $1-1}' )объединяет выбор линии, выбор поля и вычитание.
dave_thompson_085
Есть ли шанс, что кто-то может помочь с портированием этого на zshell?
Алекс С
6

Вы всегда можете редактировать и удалять записи ~/.bash_history, полезно, когда вы хотите удалить одну запись или более одной записи

Weslor
источник
2
Скорее всего, эти записи будут повторно введены при выходе из оболочки.
10
5

Если вы хотите забыть весь сеанс bash, вы можете killиспользовать текущий процесс bash. Поскольку переменная $$содержит pidтекущую оболочку, вы можете сделать:

kill -9 $$
Бруно Броноски
источник
1

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

history -c && history -w && logout

Удачи.

user882786
источник
-1
Adding another point suppose if you want to delete a range of history lines

You can use below script. 

Below example will delete history output from line 1 to line 150.

for i in `history | awk 'NR > 1 && NR <=150{print   $1}'`; do history -d $i; done
Правин Кумар Б.С.
источник