Як видалити вибрані результати з історії bash?


66

historyкоманда показує всі результати, але ми можемо відфільтрувати, щоб отримати конкретну команду за допомогою history | grep searchingCommand. Це дуже корисно.

Але проблема полягає в тому, що він показує ті команди, які також були введені з помилкою друку або які були невдалі. Тоді виявлення правильного - це справді біль. Я перевірив це посилання: Селективна історія команд у терміналі? але це не було моїм рішенням.

То чи існує спосіб видалення тих команд з історії, які були неправильними введений час або пізніше?


5
Будь ласка, змініть прийняту відповідь, є й інші, у яких більше 100 голосів.
марля

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, знову не натискайте клавішу Enter. Щоб зберегти зміни в цих рядках, виберіть будь-яку команду в історії, крім цих двох, і натисніть Ctrl+ c.

Звичайно, замість того, щоб змінювати запис історії, ви також можете видалити його, що призведе до порожнього рядка при цьому записі. Щоб видалити рядок, який наразі відображається у запиті, натисніть Ctrl+ e(що переходить до кінця рядка), а потім Ctrl+ u(що видаляє текст із початку рядка до курсору).

Дивіться також https://unix.stackexchange.com/questions/195668/what-can- why-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

Детальніше див. У цьому посібнику .


непогано :) Добре отримати новий шлях ..
Саурав Кумар

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
Це має бути правильна відповідь.
топ

19

Відредагуйте файл ~/.bash_historyта видаліть один раз із помилками друку

Наприклад, вставте цю команду:

gedit ~/.bash_history

Відредагуйте щось, що вам подобається і після, ніж збережіть файл і перезапустіть термінал. Коренева команда:

sudo -i 
inser your password
gedit ~/.bash_history

якщо ви хочете видалити все, history -cслід зробити фокус


SYNTAX

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

КЛЮЧОВИЙ

-c Очистити список історії. Це може поєднуватися з іншими параметрами, щоб повністю замінити список історії.

-d зміщення Видаліть запис історії при зміщенні позиції. зміщення слід вказати так, як воно з’являється під час відображення історії.

-a Додайте нові рядки історії (рядки історії, введені з початку поточного сеансу Bash) у файл історії.

-n Додайте рядки історії, не прочитані з файла історії, до поточного списку історії. Це рядки, додані до файлу історії з початку поточної сесії Bash.

-r Прочитайте поточний файл історії та додайте його вміст до списку історії.

-w Запишіть поточну історію у файл історії.

-p Виконайте заміну історії в аргументах і відобразіть результат на стандартному виході, не зберігаючи результати в списку історії.

-s Аргументи додаються до кінця списку історії як єдиний запис.

джерело :


Дякую, це корисно! Чи знаєте ви, як видалити запис у момент введення з командного рядка? Або є якась команда видалити запис, не відкриваючи .bash_history?
Саурав Кумар

1
@beded19899 history -cне працює Коли я закриваю термінал і знову відкриваю його, історії не видаляються. -1 Ваша відповідь
αғsnιη

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команду, щоб видалити останню команду з історії.


Де додати PROMPT_COMMAND='history -a'у .bashrcфайл? І що саме це зробить? Я спробував sed -i '$d' ~/.bash_historyце працювати без редагування .bashrc!! Але псевдонім річ ​​не працює .. Я прийму вашу відповідь, якщо ви просто розробите моє запитання і зроблять псевдонім робочим .. :)
Саурав Кумар

@SauravKumar відповідь відредагували. Пропустив сингл та подвійні лапки в команді "
Зміна"

Вірте мені чи ні .. псевдонім річ ​​все ще не працює .. Він виконується без будь-яких помилок, але не видаляє запис із .bash_historyфайлу ..: P жодним чином .. Не проблема .. Я зробив власну команду і помістив її в /binкаталог. Так як через вашу команду: sed -i "$d" ~/.bash_historyвін працює чудово. Я приймаю вашу відповідь .. :)
Саурав Кумар

Якщо ви не заперечуєте, я хотів би відредагувати вашу відповідь, щоб вона була корисною іншим ..
Саурав Кумар,

Насправді я її відредагував. Ви повинні це схвалити ..
Саурав Кумар

2

для видалення декількох рядків (наприклад, з 1974 по 1990 рік, перевірте historyкоманду):

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

зауважте, що номер рядка для видалення завжди однаковий, оскільки ви видаляєте його постійно і переходите до наступного.


Примітка дуже важлива.
Вейджун Чжоу

1

Якщо ви використовуєте опцію "set -o vi" в bash (дуже корисно для пошуку назад за допомогою клавіші Escape), ви можете шукати рядок і видалити рядок з "dd" так само, як і в "vi".


Я вважаю, що мені потрібно набрати jабо kпісля, ddщоб зробити це дійсно зрозумілим командою з історії. Якщо я введіть іншу команду або просто натисніть Enter, bash, здається, припускає, що це просто нова команда, і що вона повинна зберегти стару команду в історії. Також цікаво відзначити, що коли це зроблено правильно, він очищає команду, але не видаляє її - результат - пусті записи історії. Але це досить добре для видалення паролів, які я змушений був вводити в командному рядку, і набагато простіше, ніж інші відповіді, тому дуже дякую за публікацію!
Майкл Шепер

0

У мене виникла ситуація, коли в історії моїх башів були зайві записи з юбікею - можливо, 50 чи більше, що відповідає "ccccc .....". В ідеалі, я хотів, щоб видалити записи, що відповідають шаблону, який, мабуть, ви можете зробити з sed або чимось, якщо припустити, що ваша історія ігнорує пробіли.

У всякому разі, я лінувався і в кінцевому підсумку використовував vim, шукав 'cccc' та використовував 'dd' під час перегляду кожного матчу. Не зайняло більше хвилини.


1
Якщо ви робите це у vim, ви також можете зробити: g / cccc / d або: g / ^ cccc / d: або використовувати макрос qqnddq, то @@ (припускаємо, що ваш останній пошук був для ccccc).
htaccess

@htaccess Це, звичайно, було б простіше, але я хотів би візуально перевірити решту файлів одночасно.
Dylan_Larkin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.