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

128778
w0rldart

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

131

12 ответов на вопрос

142
Paperlantern

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

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

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

как удалить последний `history -w` из истории? KrIsHnA 9 лет назад 6
@KrIsHnA редактировать ~ / .bash_history вручную Alexander Myshov 8 лет назад 0
Или добавьте пробел перед ним, чтобы предотвратить его добавление, как в ответе @ tao Mark 8 лет назад 5
Чтобы найти `«просто» история | grep [unwanted_content] `для получения списка со всеми строками, содержащими` [unwanted_content] `(например, пароли). AvL 6 лет назад 0
Как удалить несколько (определенных) строк (по идентификатору)? Pathros 5 лет назад 0
99
cYrus

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

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

Если установлена ​​переменная среды HISTFILE, файл истории - это не ~ / .bash_history, а скорее $ . Karolos 11 лет назад 17
Записи записываются в файл истории при выходе из оболочки. Поэтому после ввода команды, которую вы хотите удалить, вам необходимо либо выйти из системы и снова войти в нее, либо использовать «history -d xxxx», чтобы удалить их из текущего сеанса оболочки. harmic 10 лет назад 20
но как бы вы удалили запись редактирования файла истории? chiliNUT 9 лет назад 2
@chiliNUT: просто начните свою команду (например, `vim ~ / .bash_history`) с пробелом; Команды, начинающиеся с пробела, обычно не регистрируются (см. `$ HISTCONTROL`). cYrus 9 лет назад 4
Я не думаю, что это так в моем дистрибутиве, но в целом это имеет смысл chiliNUT 9 лет назад 0
Используя для этого `sed`, вместо * удобного редактора * убедитесь, что ** все ** вхождения будут удалены! Смотрите [мой ответ] (http://superuser.com/a/621767/178656) F. Hauri 9 лет назад 0
Чтобы скрыть команды, начинающиеся с пробела (а также скрыть повторяющиеся записи) из вашей истории bash, поместите это в ваш .bashrc `HISTCONTROL = ignoreboth` mason81 8 лет назад 0
`history -d` кажется более правильным подходом. jamesdlin 5 лет назад 0
37
tao

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

$ export HISTCONTROL=ignorespace 

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

$ history -c -w ^-- additional space character 
30
James Haigh

First of all, if the command you're about to issue is sensitive, unsafe, or you just don't need it cluttering up your history, it is best/quickest to just prevent it from entering the history in the first place. Make sure that $HISTCONTROL contains ignorespace:

(bash)$ echo $HISTCONTROL ignoredups:ignorespace 

Then proceed any command you don't want in your history with a space:

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

If you accidentally put an unwanted command into history, providing that your bash session is still open, the command hasn't yet touched the disk. To delete the previous command in history, issue:

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

Note the leading space; this command requires ignorespace, otherwise it'll just delete itself!

If you want to delete the last few commands, find the last and first history number:

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

In this case 602 and 599. Then issue:

(bash)$ for i in ; do history -d $i; done 

(Without ignorespace, it would be 603..599.)

If you don't want any history from your current session to hit the disk, exit using:

(bash)$ kill -9 $$ 

The approach so far is to not even let sensitive history items be written to disk for extra security, because in theory data deleted from non-volatile media can still be recovered.

If, however, the command(s) you wish to remove are from a previous session, they will have already been appended to the $HISTFILE on exit. Manipulating the history with the above commands will still only append the remaining new items to the $HISTFILE, on exit. To overwrite the $HISTFILE with the current session's view of the entire history, right now, issue:

(bash)$ history -w 

Of course for history items already on disk, the alternative to editing the history with history -d commands then issuing history -w, is to edit the $HISTFILE with a text editor.

«Управление историей с помощью вышеприведенных команд будет по-прежнему только _append_ оставшимися _new_ элементами к` $ HISTFILE`, _on exit_ ». На самом деле, это не совсем так. Кажется, он только добавляет оставшиеся новые элементы, которые «выпирают» из первоначальной длины истории. Например, если я удаляю 5 оригинальных предметов и добавляю 15 новых, добавляются только последние 10 новых, тогда как я ожидаю, что все 15 новых будут добавлены. Я думаю, что это ошибка, потому что я не вижу, как это всегда желательно функциональность. James Haigh 10 лет назад 1
Я думаю, Bash принимает к сведению оригинальную длину. При закрытии сеанса он предположительно добавляет элементы, число которых превышает это значение. Если бы это значение уменьшалось каждый раз, когда удаляется элемент, число которого меньше или равно этому значению, он будет работать как положено. ;-) James Haigh 10 лет назад 1
14
F. Hauri

Several techniques:

Prevent sensitive information from being stored in the history file

If you've entered some password on a command line, then realize that all commands are logged, you could either:

  1. Force exit the current session without saving history:

     kill -9 $$ 

    This will drop all current history.

  2. Type ↑ (up arrow) in the open bash session until the sensitive information is shown, then use line editing keystrokes like Ctrl+W to delete the sensitive info, and then ↓ (down arrow) until a new empty line is prompted, before typing Enter.

Delete sensitive information from the history file

If you realize that sensitive information is already stored, and you want to delete it, but not your entire history:

A simple sed command could do the job:

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

but, as you type this, you create another history line containing the search pattern (sensitive info) you are trying to delete. So you could:

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

This will run head -n1 with input from the terminal. It will appear that your terminal is hung (there won't be a prompt); just type the information that you want to delete from the file. This is a trick to let you enter (part of) a command without actually typing it into the command line, thus making it ineligible for inclusion in the history record. Then sed will use the text that you typed to search .bash_history and delete all lines containing the sensitive info. Note: if your sensitive information pattern contains slash(es), you must escape them with backslashes, or else change the sed command to use this syntax to specify a delimiter that does not appear in the pattern:

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

Another way could be to delete only the sensitive info, but keep the commands that contain the information. For this, you could simply replace sensitive info with substitute text of your choice:

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

Delete sensitive information from any file in a specific tree

Finally, to be sure that this won't stay in another forgotten file:

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

will list all concerned files.

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

will replace all occurrences of sensitive info in all files in the directory tree rooted at .. Note: even though this command uses xargs -0, it will not handle files with newlines in their names.

11
vicentecarro

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

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

На самом деле, я считаю, что вы должны навести курсор на строку, нажать Ctrl + U, _, а затем навести курсор вверх или вниз на другую строку_ (возможно, пустую в нижней части списка). Кроме того, строго говоря, строка не была заменена звездочкой. Скорее, команда была стерта, а к _history number_ добавлено `*`. G-Man 9 лет назад 2
Это становится намного более мощным с Ctrl + R (обратный инкрементальный поиск в истории), затем, например, [End], Ctrl + U sehe 8 лет назад 1
4
Bond

If you need to remove several lines at the same time I normally use this:

history | grep <string> | cut -d ' ' -f 3 | awk '' 

If you need to remove the last command you can use:

history -d $((HISTCMD-2)) 
Это выглядело так, как будто это работает, но `история | Grep`все еще показывает все строки, которые он утверждал, чтобы удалить ... Brock Hensley 11 лет назад 0
Это удалит неправильные строки истории после удаления первой! mivk 10 лет назад 0
Но, к счастью, он печатает только неправильные команды удаления. Следующее выведет правильные команды удаления: `history | grep XYZ | grep -v grep | так | awk '' ` mivk 10 лет назад 0
3
m000

Если вам нужно удалить ряд строк из истории, следующая функция 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. Чтобы использовать эту функцию немедленно, вам понадобится снова прочитать файл с помощью запущенной оболочки ( . $HOME/.bashrc). Затем удалить, например, команды 200-210 из истории:

$ histdel 200 210 

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

Альтернативные формы для оператора `for`:` для n в $ (seq "$ 2" "$ 1") `некоторые стилистически предпочитают, и, если` seq` не работает, попробуйте `for ((n =" $ 2 "; n> =" $ 1 "; n -))`. Scott 11 лет назад 3
3
KroKite
history | sed -i 59d 

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

3
user3378188

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

$ history 

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

,
,
211 ls
212 javac Welcome.java
213 java добро пожаловать
.
,

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

$ history -d 211 

Здесь 211 - идентификатор истории. Теперь проверьте это с помощью

$ history 

,
,
211 javac Welcome.java
212 java добро пожаловать
.
,

Похожие вопросы