Как удалить историю последних 10 команд в раковине?

Команды следуют

  511  clear
  512  history
  513  history -d 505
  514  history
  515  history -d 507 510 513
  516  history
  517  history -d 509
  518  history
  519  history -d 511
  520  history

Я могу удалить единственный история-d 511 , но как удалить последние 10 команд и промежуточные 10 историй команд, используя единственную команду в раковине?

Мы можем написать сценарий удара и выполнить за удаление истории?

95
Почему ssh признак?
добавлено автор Barmar, источник
Shell командует работой то же самое ли you' ре загрузилось в местном масштабе или через ssh.
добавлено автор Barmar, источник
Этот вопрос вне темы ? или Это место разве мастера не должно спрашивать этот вид вопроса? Если так, где я должен задать этот вопрос, я имею в виду, где в стеке обменивают?
добавлено автор Justin John, источник
@Barmar: Я использую ssh.
добавлено автор Justin John, источник
@DanMoulding этот вопрос может мигрировать к unix.stackexchange.com? Если так, как?
добавлено автор Justin John, источник
Программирование сценария оболочки является идеальным решением этого вопроса, следовательно это нужно считать связанным с программированием. Не говоря уже о том, что OP, который на самом деле попросили определенно сценария.
добавлено автор SSH This, источник
vi $HISTFILE и удаляет то, что вы хотите. Используйте главный-n-10 , если необходимо автоматизировать его.
добавлено автор Anton Kovalenko, источник
Unix и Linux StackExchange (unix.stackexchange.com) являются, вероятно, лучшим местом проведения этого вопроса. It' s вне темы здесь, потому что это doesn' t имеют отношение строго к программированию.
добавлено автор Dan Moulding, источник

11 ответы

Имейте вас, пытался редактировать файл истории непосредственно:

~/.bash_history
89
добавлено
@WherethereisaWill OP хотел сценарий, не ручной штепсель и пыхтение.
добавлено автор Tyler Jandreau, источник
Понятый @ErikLandvall. Вы имеете в виду: Даже если я закрываю терминал, нет никакой гарантии, что история будет, пишут, чтобы .bash_history файл?
добавлено автор Fizer Khan, источник
@ErikLandvall необходимо закрыть терминал и открыть другой терминал и отредактировать файл истории.
добавлено автор Fizer Khan, источник
@ErikLandvall я неправильно понял. Спасибо за ваши разъяснения.
добавлено автор Fizer Khan, источник
иногда it' s сохраненный в памяти и любой ручной привычке редактирования быть сохраненным после следующего логина..
добавлено автор superhero, источник
@FizerKhan я подразумеваю, что изменения, внесенные в .bash_history , могут быть переписаны тем, что сохранено в памяти. Я счел это решение полезным: superuser.com/a/384383/253543
добавлено автор superhero, источник
@FizerKhan, что помощь привычки факт это it' s сохраненный в памяти. It' s файл истории, который иногда сохраняется в памяти, поэтому даже если вы редактируете файл это, привычка вступает в силу..
добавлено автор superhero, источник
вступит в силу после перезапуска (закрытие и повторное открытие) терминал
добавлено автор khaled_webdev, источник
Если вы делаете это с энергией, можно найти историю удаления в ~ / .viminfo так убедиться удалить это также!
добавлено автор waltwood, источник

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

Доберитесь ваша текущая история (приспособьте количество линий, которые вы хотите видеть):

history | tail -n 10

Это дает мне что-то как

1003  25-04-2016 17:54:52 echo "Command 1"
1004  25-04-2016 17:54:54 echo "Command 2"
1005  25-04-2016 17:54:57 echo "Command 3"
1006  25-04-2016 17:54:59 echo "Command 4"
1007  25-04-2016 17:55:01 echo "Command 5"
1008  25-04-2016 17:55:03 echo "Command 6"
1009  25-04-2016 17:55:07 echo "Command 7"
1010  25-04-2016 17:55:09 echo "Command 8"
1011  25-04-2016 17:55:11 echo "Command 9"
1012  25-04-2016 17:55:14 echo "Command 10"

Выберите начало и конечные положения для пунктов, которые вы хотите удалить. Я собираюсь удалить записи 1006 - 1008.

for h in $(seq 1006 1008 | tac); do history -d $h; done

Это произведет историю-d команды для 1008 тогда 1007 тогда 1006.

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

Можно получить это с (может быть лучший путь):

history 1 | awk '{print $1}'

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

for h in $(seq 1006 1008 | tac); do history -d $h; done; history -d $(history 1 | awk '{print $1}')

Оберните это все в функцию, чтобы добавить к вашему ~/.bashrc :

histdel(){
  for h in $(seq $1 $2 | tac); do
    history -d $h
  done
  history -d $(history 1 | awk '{print $1}')
  }

Удаление в качестве примера командует 4, 5 и 6 (1049-1051) и сокрытие доказательств:

[18:21:02 [email protected] ~]$ history 11
 1046  25-04-2016 18:20:47 echo "Command 1"
 1047  25-04-2016 18:20:48 echo "Command 2"
 1048  25-04-2016 18:20:50 echo "Command 3"
 1049  25-04-2016 18:20:51 echo "Command 4"
 1050  25-04-2016 18:20:53 echo "Command 5"
 1051  25-04-2016 18:20:54 echo "Command 6"
 1052  25-04-2016 18:20:56 echo "Command 7"
 1053  25-04-2016 18:20:57 echo "Command 8"
 1054  25-04-2016 18:21:00 echo "Command 9"
 1055  25-04-2016 18:21:02 echo "Command 10"
 1056  25-04-2016 18:21:07 history 11
[18:21:07 [email protected] ~]$ histdel 1049 1051
[18:21:23 [email protected] ~]$ history 8
 1046  25-04-2016 18:20:47 echo "Command 1"
 1047  25-04-2016 18:20:48 echo "Command 2"
 1048  25-04-2016 18:20:50 echo "Command 3"
 1049  25-04-2016 18:20:56 echo "Command 7"
 1050  25-04-2016 18:20:57 echo "Command 8"
 1051  25-04-2016 18:21:00 echo "Command 9"
 1052  25-04-2016 18:21:02 echo "Command 10"
 1053  25-04-2016 18:21:07 history 11

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

histdeln(){

  # Get the current history number
  n=$(history 1 | awk '{print $1}')

  # Call histdel with the appropriate range
  histdel $(( $n - $1 )) $(( $n - 1 ))
  }

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

42
добавлено
история | хвост-1 | awk ' {печатают 1$} ' может быть упрощен, чтобы историю 1 | awk ' {печатают 1$} '
добавлено автор thirtythreeforty, источник
Спасибо - Обновленный мой ответ.
добавлено автор JGC, источник
for x in `seq $1 $2`
do
  history -d $1
done
25
добавлено
@Matthew That' s не необходимый. I' m, не удаляя $x каждый раз через петлю, I' m удаляющий 1$ . Таким образом, это сначала удаляет 511, и 512 становится 511. Тогда это удаляет 511 снова и так далее.
добавлено автор Barmar, источник
Уведомление о @Matthew, что я сделал подобный комментарий к Tyler' s ответ. Я предложил свое решение как фиксацию для этого.
добавлено автор Barmar, источник
вы правильны в моей поспешности, когда выписал это в одной линии в моем ударе, быстром, я использовал , поскольку я в ... и , история-d $i и получила результаты, которые я описал в своем комментарии выше. Используя 1$ это абсолютно правильно, как указано в вашем оригинальном ответе.
добавлено автор Matthew, источник
Обязательно используйте более высокое количество для первого аргумента, или вы удалите любую команду. Например, когда команда 511 удалена, все переходит вниз, таким образом, 512 становится новыми 511, и 513 новые 512. Для этого история-d 511 работы как ожидалось, затем , история-d 512 удаляет, что раньше был 513, и 512 остается в истории как команда 511. Надежда, которая имеет смысл.
добавлено автор Matthew, источник

править:

Измененный окруженный iterators, хорошее требование. Кроме того, вызовите эту функцию с переменой iterator.

Можно, вероятно, сделать что-то вроде этого:

#!/bin/bash
HISTFILE=~/.bash_history   # if you are running it in a 
                           # non interactive shell history would not work else
set -o history
for i in `seq $1 $2`;
do
    history -d $i
done
history -w

Где вы вызовете как это:

./nameOfYourScript 563 514

Заметьте, что я не вставил проверки на ошибки для границ. Я оставлю это как осуществление читателю.

see also this question

9
добавлено
После того, как вы удаляете 510, 511 становится 510, 512 становится 511, и так далее. Таким образом, это удалит любую линию.
добавлено автор Barmar, источник
Вы не можете включать переменные в расширения скобы.
добавлено автор chepner, источник
seq 563 514 ничего не напечатает. Вы должны seq 563 - 1 514 . Поочередно, можно просто использовать историю-d 1$ с аргументами как 514 563
добавлено автор anishsane, источник

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

К свободным путям от скажем, линии 1800 - 1815 пишут следующее в терминале:

$ for line in $(seq 1800 1815) ; do history -d 1800; done

Если вы захотите удалить историю для команды удаления, добавьте +1 на 1815 = 1816 и история для той последовательности +, то команда удаления будет удалена.

Например:

$ for line in $(seq 1800 1816) ; do history -d 1800; done
9
добавлено
Спасибо Энтони, надежда это помогает всем парням здесь
добавлено автор Ghassan Zein, источник
Я отклонил Binod' s предложенный редактируют как it' s не логическая ошибка. Ghassan' s оригинальный код использует тот же самый подход в качестве Barmar' s ответ – который работает. Комментарии к Barmar' s ответ объясняют, почему предложение замены 1800 с , $line удаляет любую линию и затем превышает желаемый диапазон.
добавлено автор Anthony Geoghegan, источник
Я сделал обновление, но все еще не работающий правильно в Ubuntu 12.04..: (Похоже, что часть номера строки не работает правильно
добавлено автор Binod, источник

Объединение ответов сверху:

история-w vi ~/.bash_history история-r

6
добавлено
Возможно, это не лучший ответ на вопрос, но это действительно полезное и более общее.
добавлено автор Nour Chawich, источник
это - то, которое я хочу!
добавлено автор once, источник

Maybe will be useful for someone.
When you login to any user of any console/terminal history of your current session exists only in some "buffer" which flushes to ~/.bash_history on your logout.
So, to keep things secret you can just:
history -r && exit
and you will be logged out with all your session's (and only) history cleared ;)

6
добавлено

история-c очистит все истории.

2
добавлено
действительно плохо, потому что его просто плохой
добавлено автор kiltek, источник
Пожалуйста, улучшите этот ответ
добавлено автор Infra DBA, источник

удалить последние 10 записей (на основе вашего примера):

history -d 511 520
1
добавлено
В ударе ГНУ версия 4.3.11 (1) это только удаляет первую линию в списке
добавлено автор Gary, источник

Простая функция может убить все числом (хотя это блюет на ошибках),

kill_hist() {
    for i in $(echo [email protected] | sed -e 's/ /\n/g;' | sort -rn | sed -e 's/\n/ /;')
    do
            history -d $i;
    done
}
kill_hist `seq 511 520`
# or kill a few ranges
kill_hist `seq 1001 1010` `seq 1200 1201`
0
добавлено
for h in $(seq $(history | tail -1 | awk '{print $1-N}')  $(history | tail -1 | awk '{print $1}') | tac); do history -d $h; done; history -d $(history | tail -1 | awk '{print $1}')

Если вы хотите удалить 10 линий, тогда просто изменяют ценность N к 10.

0
добавлено
Linux Help
Linux Help
2 686 участник(ов)

Правила: https://telegra.ph/Pravila-Linux-Help-10-15

Linux Security
Linux Security
652 участник(ов)

Данная группа принципиально про безопасность и в частности про безопасность Linux. Прочие темы просим обсуждать в профильных чатах.

pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.

Linux Gaming RUS
Linux Gaming RUS
28 участник(ов)

Русскоязычный чатик, посвящённый играм на различных дистрибутивах Linux, а также wine, proton Arch Linux RU @ArchLinuxChatRU Gnome RU @gnome_ru