Вопрос: Удалить определенную строку из файла истории Bash


Как удалить определенную строку из historyв базе данных?


128
2018-01-31 15:43


Источник




Ответы:


Вам нужно выйти и вернуться или запустить history -a поэтому текущая история привязана к диску.

Затем просто отредактируйте файл ~/.bash_history,


95
2018-01-31 16:01



Если задана переменная среды HISTFILE, файл истории не является ~ / .bash_history, а скорее $ {HISTFILE}. - Karolos
Записи записываются в файл истории при выходе из оболочки. Поэтому после ввода команды, которую вы хотите удалить, вам необходимо либо выйти из системы, либо использовать «history -d xxxx», чтобы удалить их из текущего сеанса оболочки. - harmic
но как бы вы удалили запись редактирования файла истории? - chiliNUT
@chiliNUT: Просто запустите свою команду (например. vim ~/.bash_history) с пространством; команды, начинающиеся с пробела, обычно не регистрируются (см. $HISTCONTROL). - cYrus
Я не думаю, что это дело в моем распределении, но в целом это имеет смысл - chiliNUT


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

  1. Typing history -d <line_number> удаляет указанную строку из истории в памяти.
  2. Typing history -w записывает текущую историю в памяти в ~/.bash_history файл.

Два шага вместе удаляют строку навсегда из встроенной памяти история и из .bash_history файл.


140
2018-01-31 16:09



как удалить последний history -w из истории? - KrIsHnA
@KrIsHnA редактировать ~ / .bash_history вручную - Alexander Myshov
Или добавьте пробел перед ним, чтобы предотвратить его добавление, как в ответе @ tao - Mark
Найти <line_number> просто history | grep [unwanted_content] для получения списка со всеми строками, содержащими [unwanted_content] (например, пароли). - AvL
Как удалить несколько (конкретных) строк (по id)? - Pathros


к не допустить в первую очередь добавьте команду в историю, убедитесь, что переменная окружения HISTCONTROL содержит среди разделенных двоеточиями значений значение ignorespace, например (добавить, например, .bashrc):

$ export HISTCONTROL=ignorespace

Это предотвратит добавление какой-либо команды с ведущим пространством в историю. Вы можете полностью очистить историю, выполнив

$  history -c -w
  ^-- additional space character

37
2018-02-01 22:19





Прежде всего, если команда, которую вы собираетесь выпускать, является чувствительной, небезопасной или вам просто не нужно ее загромождать вашу историю, лучше всего или просто просто предотвратить ее вхождение в историю в первую очередь. Убедись, что $HISTCONTROL содержит ignorespace:

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace

Затем выполните любую команду, которую вы не хотите в своей истории, с пробелом:

(bash)$  sensitive-cmd-with --password 82cf7dfe
(bash)$  rm -r... # One-off recursive remove; mustn't be accidentally repeated!

Если вы случайно поместили нежелательную команду в историю, при условии, что ваш сеанс bash все еще открыт, команда еще не коснулась диска. Чтобы удалить предыдущую команду в истории, выполните следующие действия:

(bash)$  history -d $((HISTCMD-1))

Обратите внимание на ведущее пространство; эта команда требует ignorespace, иначе он просто удалит себя!

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

(bash)$  history 5
  598  ok
  599  sensitive
  600  unsafe
  601  doesn\'t-work
  602  otherwise-unwanted

В этом случае 602 и 599. Затем выведите:

(bash)$  for i in {602..599}; do history -d $i; done

(Без ignorespace, это будет 603..599.)

Если вы не хотите Любые историю с вашего текущего сеанса, чтобы попасть на диск, выйдите с помощью:

(bash)$ kill -9 $$

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

Если, однако, команды (ы), которые вы хотите удалить, относятся к предыдущему сеансу, они будут добавлены к $HISTFILE на выходе. Манипулирование историей с помощью приведенных выше команд будет по-прежнему присоединять оставшиеся новый предметов для $HISTFILE, на выходе, к затирать  $HISTFILE с представлением текущей сессии о все история, прямо сейчас, выпуск:

(bash)$  history -w

Конечно, для предметов истории, уже находящихся на диске, альтернатива редактированию истории с помощью history -d команды, выдающие history -w, заключается в редактировании $HISTFILE с текстовым редактором.


30
2018-06-18 16:33



«Манипулирование историей с помощью приведенных выше команд будет по-прежнему присоединять оставшиеся новый предметов для $HISTFILE, на выходе«На самом деле, это не совсем так. Кажется, что только добавляет оставшиеся новые элементы, которые «торчат» из первоначальной длины истории. Например. Если я удалю 5 оригинальных элементов и добавлю 15 новых, добавятся только последние 10 новых, тогда как я ожидаю, что все 15 новых будут добавлены. Я думаю, что это ошибка, потому что я не вижу, как это когда-либо желательно. - James Haigh
Я думаю, bash принимает к сведению первоначальную длину. При закрытии сеанса он предположительно добавляет элементы, число которых больше этого значения. Если это значение уменьшалось каждый раз, когда элемент удаляется, число которого меньше или равно этому значению, оно будет работать, как ожидалось. ;-) - James Haigh


Несколько методов:

Предотвращение хранения конфиденциальной информации в файле истории

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

  1. Выйти из текущей сессии без сохранения истории:

     kill -9 $$
    

    Это приведет к потере всей текущей истории.

  2. Тип ↑ (стрелка вверх) в открытой сессии bash до тех пор, пока не будет показана конфиденциальная информация, затем используйте клавиши редактирования строк, например Ctrl+W для удаления конфиденциальной информации и тогда  ↓ (стрелка вниз) пока не появится новая пустая строка, до типирование Войти,

Удаление конфиденциальной информации из файла истории

Если вы понимаете, что конфиденциальная информация уже сохранена, и вы хотите ее удалить, но не всю свою историю:

Просто sed команда могла бы выполнить эту работу:

sed -e '/SeNsItIvE InFo/d' -i .bash_history

но при вводе этого значения вы создаете другую строку истории, содержащую шаблон поиска (чувствительная информация), которую вы пытаетесь удалить. Таким образом, вы могли:

sed -e "/$(head -n1)/d" -i .bash_history

Это будет выполняться head -n1 с входом от терминала. Похоже, что ваш терминал подвешен (не будет приглашения); просто введите информацию, которую вы хотите удалить из файла. Это трюк, позволяющий ввести (часть) команду не введя его в командную строку, что делает его неприемлемым для включения в историю записи. затем sed будет использовать текст, который вы ввели для поиска .bash_history и удалите все строки, содержащие конфиденциальную информацию. Примечание: если ваш шаблон конфиденциальной информации содержит слэши, вы должны избегать их с обратной косой чертой, или изменить sed команду использовать этот синтаксис для указания разделителя, который не отображается в шаблоне:

sed -e "\|$(head -n1)|d" -i .bash_history

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

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.

Удаление конфиденциальной информации из любого файла в определенном дереве

Наконец, чтобы быть уверенным, что это не останется другой забытый файл:

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"

перечислит все соответствующие файлы.

find . -type f -print0 |
    xargs -0 grep -l "$SENSITIVEINFO" |
    tr \\n \\0 |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

заменит все вхождения конфиденциальной информации во все файлы в дереве каталогов, ., Примечание: даже если эта команда использует xargs -0, он не будет обрабатывать файлы с символами новой строки в своих именах.


14
2017-07-19 12:50





Найдите строку, которую хотите удалить, нажав ↑ (стрелка вверх) пока он не появится, затем нажмите Ctrl+U, Это должно удалить линию.

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


10
2018-04-01 16:00



На самом деле, я считаю, что вы должны двигаться вверх до линии, нажмите Ctrl + U, и затем курсор вверх или вниз на другую строку (возможно, пустой в нижней части списка). Кроме того, строго говоря, строка не была заменена звездочкой. Скорее, команда была стерта, и номер истории прилагается с помощью *, - G-Man
Это становится намного более мощным с помощью Ctrl + R (обратный инкрементный поиск истории), затем, например, [Конец], Ctrl + U - sehe


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

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'

Если вам нужно удалить последнюю команду, вы можете использовать:

history -d $((HISTCMD-2))

4
2018-01-07 05:53



Похоже, что это сработало, но history | grep <string> все еще показывает все строки, которые он утверждал, чтобы удалить ... - Brock Hensley
Это удалит неправильные строки истории после удаления fisrt !! - mivk
Но, к счастью, он печатает только неправильные команды удаления. Следующее выведет правильные команды удаления: history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}' - mivk


Если вам нужно удалить ряд строк из истории, следующая функция bash может сэкономить вам некоторое время:

function histdel() {
    [ $# -eq 1 ] && history -d "$1" && history -w
    if [ $# -eq 2 -a "$1" -le "$2" ]; then
        for n in `seq "$2" "$1"`; do
            history -d "$n"
        done
        history -w
    fi
}

Функция обычно должна быть добавлена ​​к $HOME/.bashrc, Чтобы использовать функцию imediatelly, вам нужно будет снова прочитать файл вашей рабочей оболочкой (. $HOME/.bashrc). Затем для удаления, например. команды 200-210 из истории:

$ histdel 200 210

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


3
2017-10-26 14:09



Альтернативные формы для for заявление: for n in $(seq "$2" "$1") стилистически предпочтительнее некоторых, и, если seqне работает, попробуйте for ((n="$2"; n>="$1"; n--)), - Scott


history | sed -i 59d

59 - номер строки. Не может быть ничего более сладкого, чем это :)


3
2018-04-03 21:16





Просто попробуй,

$ history

это будет отображать идентификатор истории и команды, например.

,
  ,
  211 ls
  212 javac Welcome.java
  213 приветствия java
  ,
  ,

использовать,

$ history -d 211

Здесь 211 - это идентификатор истории. Теперь проверьте это, используя

$ history

,
  ,
  211 javac Welcome.java
  212 приветствовать java
  ,
  ,


3
2018-03-04 11:16