Как удалить выбранные результаты из истории Bash?

66

historyКоманда показывает все результаты, но мы можем фильтровать, чтобы получить конкретную команду, используя history | grep searchingCommand. Это действительно полезно.

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

Так есть ли способ удалить те команды из истории, которые были неверны во время ввода или позже?

Саурав Кумар
источник
5
Пожалуйста, измените принятый ответ, есть другие с более чем 100 голосами за.
Greuze
1
@greuze: изменен на лучший ответ. Подсчет голосов не означает, что он лучший!
Саурав Кумар

Ответы:

20

Я хотел бы добавить еще один метод изменения (или удаления) записей истории, который я обнаружил довольно случайно, когда работал с bash:

Чтобы продемонстрировать это, начните с выполнения следующих трех команд в bash:

$ echo 1
1
$ echo 2
2
$ echo 3
3

Теперь вы можете снова выбрать эти команды, используя клавиши со стрелками или Ctrl+ pи Ctrl+ n.

Скажем, вы хотите изменить первые две команды. Перемещайтесь по истории, пока не echo 1появится, и измените ее на echo 1 - changed, но НЕ НАЖИМАЙТЕ ВВОД. Если вы теперь продвинетесь дальше в своей истории, эта линия останется в своем измененном состоянии, и вы сможете отойти от нее и вернуться к ней. Теперь перейдите к строке echo 2и измените ее на echo 2 - changed, снова не нажимайте ввод. Чтобы сохранить изменения в этих строках, выберите любую команду в истории, кроме этих двух, и нажмите Ctrl+ c.

Конечно, вместо изменения записи истории, вы также можете удалить ее, что приведет к пустой строке в этой записи. Чтобы удалить строку, отображаемую в данный момент в приглашении, нажмите Ctrl+ e(который переходит на конец строки), а затем Ctrl+ u(который удаляет текст от начала строки до курсора).

См. Также https://unix.stackexchange.com/questions/195668/what-can-cause-an-item-to-be-deleted-from-my-bash-history/195726#195726 для более подробного объяснения техническое образование.

Самый простой способ:

  1. ctrl+ rдля поиска команды, которую вы хотите удалить / изменить.
  2. end выбрать искомую команду для удаления / изменения
  3. Удалить или изменить выбранную команду (не нажимайте enterили ctrl+ c)
  4. стрелка вверх (или ctrl+ p) или стрелка вниз (или ctrl+ n), чтобы выбрать любую другую команду.
  5. ctrl+ c Вот и все!

Примечание :

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

history -w
Стефан Хамке
источник
Большое спасибо Стефан! Я должен сказать, что вы принесли потрясающие вещи. Используя это, я нашел самый простой способ изменить / удалить историю: 1.ctrl+r найти команду, которую вы хотите удалить / изменить. 2.end переместить команду и удалить / изменить команду. 3.ctrl+n перейти к следующей строке, а затем 4.ctrl+c
Саурав Кумар
144

Использование:

history -d OFFSET

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

И для сохранения изменений в истории используйте:

history -w

Подробнее смотрите в этом руководстве .

user299481
источник
не плохо :) Хорошо, чтобы получить новый путь ..
Саурав Кумар
10
@SauravKumar Неплохо?!? Вероятно, это лучший способ ...
Раду Рэдяну
5
ЧИТАЙТЕ ПЕРВЫМ: Просто чтобы быть ясным, вы должны сделать history -wпослесловие, чтобы сохранить изменения. Также OFFSET означает, какой номер historyотображается. Если строка, которую вы пытаетесь удалить, это 873, используйте history -d 873.
Cammy_the_block
2
@ RaduRădeanu Используйте history -wпосле, history -dчтобы сохранить изменения.
Cammy_the_block
20
Это должен быть правильный ответ.
Topher
19

Отредактируйте файл ~/.bash_historyи удалите один раз с опечатками

Например, вставьте эту команду:

gedit ~/.bash_history

Отредактируйте то, что вам нравится, и после этого сохраните файл и перезапустите терминал. Корневая команда:

sudo -i 
inser your password
gedit ~/.bash_history

если вы хотите удалить все history -cдолжны сделать свое дело


СИНТАКСИС

history
history [n]
history -c
history -d offset
history [-anrw] [filename]
history -ps arg

KEY

-c Очистить список истории. Это может быть объединено с другими вариантами, чтобы полностью заменить список истории.

-d смещение Удалить запись истории при смещении позиции. Смещение должно быть указано так, как оно отображается при отображении истории.

-a Добавить новые строки истории (строки истории, введенные с начала текущей сессии Bash) в файл истории.

-n Добавить строки истории, еще не прочитанные из файла истории, в текущий список истории. Это строки, добавленные в файл истории с начала текущего сеанса Bash.

-r прочитать текущий файл истории и добавить его содержимое в список истории.

-w Запишите текущую историю в файл истории.

-p Выполнить подстановку истории по аргументам и отобразить результат на стандартном выводе, не сохраняя результаты в списке истории.

Аргументы добавляются в конец списка истории как одна запись.

источник :

blade19899
источник
Спасибо, это полезно! Знаете ли вы, как удалить запись в момент ввода из командной строки? Или есть какая-нибудь команда, чтобы удалить запись, не открывая .bash_history?
Саурав Кумар
1
@ bladed19899 history -cне работает Когда я закрываю терминал и открываю его снова, истории не удаляются. -1 ваш ответ
αғsнιη
1
@KasiyA, -c Clear the history list. This may be combined with the other options to replace the history list completely. источник
blade19899
2
@KasiyA Используйте history -wпосле, history -cчтобы написать изменения.
Cammy_the_block
16

Если вы хотите немедленно удалить его из того же терминала, сначала добавьте следующее в файл ~ / .bashrc.

PROMPT_COMMAND='history -a' 

и перезапустите свой терминал.

Вы можете добавить его в любом месте файла .bashrc. Я добавил, как показано ниже, вместе с другими историческими материалами.

введите описание изображения здесь

Обычно во время сеанса bash исполняемые команды не записываются в .bash_history до тех пор, пока сеанс не будет завершен, и, следовательно, немедленно PROMPT_COMMAND='history -a'вводит команду в .bash_history.

Теперь всякий раз, когда вы делаете ошибку или ошибку в команде и хотите удалить ее, просто выполните следующее

sed -i '$d' ~/.bash_history

и тада это будет удалено.

Чтобы упростить его, вы можете использовать псевдоним для чего-то более простого и использовать его, например:

alias rh ='sed -i '\''$d'\'' ~/.bash_history'

Таким образом, выполнение rhудалит последнюю выполненную команду из истории.

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

alias rh = 'sed -i '\''$d'\'' ~/.bash_history' 

в .bashrc

НОТА

Там не должно быть места с обеих сторон =

Если вы не хотите, чтобы псевдоним, то вы также можете сделать следующее

Введите имя запятой rhи поместите его в /binкаталог:

  • Откройте файл, скажите rhи вставьте следующий код, сохраните и закройте:

    sed -i '$d' ~/.bash_history

  • Сделать rh исполняемый файл и поместите его в /binкаталог:

     chmod + x rh
     sudo cp rh / bin 
  • Теперь используйте rhкоманду, чтобы удалить недавнюю команду из истории.

Stormvirux
источник
Где добавить PROMPT_COMMAND='history -a'в .bashrcфайл? И что именно это будет делать? Я пытался sed -i '$d' ~/.bash_historyэто работает без редактирования .bashrc! Но псевдоним не работает .. Я приму ваш ответ, если вы просто разработаете мой вопрос и сделаете псевдоним рабочим .. :)
Саурав Кумар,
@SauravKumar отредактировал ответ. Пропустил одинарные и двойные кавычки в команде псевдонимов .. Мой плохой ..: P
Stormvirux
Верьте мне или нет .. псевдоним все еще не работает .. Он выполняется без каких-либо ошибок, но не удаляет запись из .bash_historyфайла ..: P в любом случае .. Не проблема .. Я сделал свою собственную команду и поместил ее в /binкаталог. Так как из-за вашей команды: sed -i "$d" ~/.bash_historyон работает нормально. Я принимаю ваш ответ .. :)
Саурав Кумар
Если вы не возражаете, я хотел бы отредактировать ваш ответ так, чтобы он был полезен для других ..
Саурав Кумар
На самом деле я редактировал это. Вы должны это одобрить ..
Саурав Кумар
2

удалить несколько строк (например, с 1974 по 1990, проверьте с помощью historyкоманды):

  for i in `seq 1974 1990` ; do history -d 1974 ; done

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

törzsmókus
источник
Примечание очень важно.
Вейцзюнь Чжоу
1

Если вы используете опцию «set -o vi» в bash (очень полезно для поиска с помощью клавиши Escape), вы можете выполнить поиск строки и удалить строку с помощью «dd» так же, как в «vi».

IT парень
источник
Я считаю, что мне нужно набрать jили kпосле, ddчтобы действительно очистить команду от истории. Если я наберу другую команду или просто нажму Enter, bash, похоже, предполагает, что это просто новая команда и что она должна сохранить старую команду в истории. Интересно также отметить, что когда все сделано правильно, команда очищается, но не удаляется - в результате появляются пустые записи истории. Но этого достаточно для удаления паролей, которые мне пришлось вводить в командной строке, и гораздо проще, чем для других ответов, так что большое спасибо за публикацию этого!
Майкл Шепер
0

У меня была ситуация, когда в моей истории bash были лишние записи с Yubikey - может быть, 50 или около того, соответствующие 'ccccc .....'. В идеале мне нужен был способ удалить записи, соответствующие шаблону, что, я полагаю, вы могли бы сделать с помощью sed или чего-то еще, предполагая, что ваша история игнорирует пробелы.

В любом случае, я стал ленивым и закончил тем, что использовал vim, искал 'cccc' и использовал 'dd', перебирая все совпадения. Не заняло больше минуты.

Dylan_Larkin
источник
1
Если вы делаете это в vim, то вы также можете сделать: g / cccc / d или: g / ^ cccc / d: или использовать макрос qqnddq тогда @@ (предполагается, что ваш последний поиск был ccccc).
htaccess
@htaccess Это, конечно, было бы проще, но я хотел визуально проверить остальную часть файла одновременно.
Dylan_Larkin