Удалите последние строки N из истории удара

'сервисная nfs' (/etc/init.d/nfs) клиент NFS. Для запуска сервера NFS необходимо использовать service nfsserver start

Вы, возможно, должны были бы установить nfs-kernel-server пакет (если это уже не установлено).

42
08.04.2016, 12:34
9 ответов

Можно использовать history -d offset встроенный для удаления определенной строки из истории текущей оболочки, или history -c очистить целую историю.

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

rmhist() {
    start=$1
    end=$2
    count=$(( end - start ))
    while [ $count -ge 0 ] ; do
        history -d $start
        ((count--))
    done
}

Назовите его с rmhist first_line_to_delete last_line_to_delete. (Номера строки согласно выводу history.)

(Используйте history -w вызвать запись в файл истории.)

36
27.01.2020, 19:35
  • 1
    Начиная с OP, который попросили удаления N последние строки, этот сценарий должен быть изменен путем выполнения чего-то как: tot_lines=$(history | wc -l) и затем повторитесь history -d $(( tot_lines - $1 )). –  PlasmaBinturong 19.01.2018, 11:13
  • 2
    Вместо $(history | wc -l), существует переменная $HISTCMD это может использоваться. –  PlasmaBinturong 19.01.2018, 11:58

Поможет только одна строка в командной строке.

for i in {1..N}; do history -d START_NUM; done

Где START_NUM - начальная позиция записи в истории. N - количество записей, которые вы можете удалить.

пример: для i в {1..50}; сделать историю -d 1030; done

31
27.01.2020, 19:35

Ответ пользователя 2982704 почти сработал, но не совсем. Пришлось сделать такую ​​небольшую вариацию.

Предполагая, что моя история равна 1000, и я хочу удалить последние 50 записей

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
0
27.01.2020, 19:35

Если удалить строку Nиз истории, то строка N+1перемещается на позицию Nи т.д.

По этой причине я предпочитаю определять строки истории oldestи newest, между которыми я хочу удалить всю историю. (Примечание:oldest<newest).

Если, например, я хочу удалить строки истории с oldest = 123по newest = 135, я бы написал:

$ for i in {135..123}; do history -d $i ; done

Мне легче читать; помимо :команда forтакже может уменьшать диапазон...

6
27.01.2020, 19:35

Это должно удалить каждую запись списка истории в обратном порядке N раз:

function hd { for i in $(seq 1 $1); do history -d $(($HISTCMD-1)); done; }

Если вы хотите добавить это в свой.bashrc, используйте:

echo "function hd { for i in $(seq 1 $1); do history -d \$((\$HISTCMD-1)); done; }">>~/.bashrc

...и затем source ~/.bashrc, чтобы перезагрузить конфигурацию bash. Использовать как:

hd <N>, where N is the number of lines to delete

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

РЕДАКТИРОВАТЬ :Для формы командной строки используйте это:

for i in {1..10}; do history -d $(($HISTCMD-11)); done

Также см. этот вопрос:

https://stackoverflow.com/questions/14750650/how-to-delete-history-of-last-10-commands-in-shell

1
16.03.2020, 18:41

historyБаш, построенный -в команде, также занимает диапазон, теперь в 2020 году:

-d offset

Delete the history entry at position offset. If offset is negative, it is interpreted as relative to one greater than the last history position, so negative indices count back from the end of the history, and an index of -1 refers to the current history -d command.

-d start-end

Delete the history entries between positions start and end, inclusive. Positive and negative values for start and end are interpreted as described above.

Только сама команда не говорит с--help:

 Options:
   -c        clear the history list by deleting all of the entries
   -d offset delete the history entry at position OFFSET. Negative
             offsets count back from the end of the history list

   -a        append history lines from this session to the history file
  ...

. history -d 2031-2034удаляет сразу четыре строки. Вы можете использовать $HISTCMDдля удаления самых новых N строк в обратном направлении.


Вы также можете экспортировать с помощью history -w tmpfile, затем отредактировать этот файл, очистить с помощью history -cи затем прочитать обратно с помощью history -r tmpfile. Не записывать в .bash _историю .

17
16.03.2020, 19:30

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

Чтобы было понятнее, я пробовал решение, которое удаляло бы номер строки в будущем. И вау, какой большой сюрприз от того, насколько это сложно. Основная проблема заключается в том, что процедура истории работает в фоновом режиме, поэтому удаление, скажем, числа 50 приведет к тому, что число 51 теперь станет 50 менее чем за секунду. Поэтому я попытался создать функцию для удаления в обратном направлении с конца. И при попытке удалить 10 подряд, получается около 5, прежде чем закончатся команды, когда они сместятся вниз. Поэтому я попытался создать функцию для удаления переадресаций, и по какой-то причине она получает только все остальные.В соответствии с подпрограммой истории, работающей примерно вдвое медленнее, чем функция. Я также пробовал вставлять сон в определенные моменты.

Я попытался временно отключить историю, но затем $HISTCMD показал итоговую сумму из $HISTFILE, а не список истории. Так что это выглядит маловероятным. Моя цель состояла в том, чтобы почистить историю от ненужных команд, чтобы я мог запомнить номер удара! #и используйте те же для частых и сложных команд.

Вот некоторые функции, которые я пробовал. Может быть, кто-то может улучшить или продиагностировать:

Going from the Number to the end:
function hd2 { a=$HISTCMD; echo $a; echo $1; echo $(($a%$1)); for i in $(seq $1 $a); do echo $i; history -d $i; done; }

Deleting from the end repeatedly with sleep:
function hd3 { a=$HISTCMD; echo $a; echo $1; echo $(($a%$1)); for i in $(seq 1 $a); do history -d $HISTCMD; sleep 1; done; }

Deleting the Number repeatedly with sleep:
function hd4 { a=$HISTCMD; echo $a; echo $1; echo $(($a%$1)); for i in $(seq 1 $a); do history -d $1; sleep 1; done; }

Начальная эхо-переменная предназначена для отладки. % - это остаток или мод. $HISTCMD не выполняет подстановку команд и должна быть назначена как переменная.

новая идея :, поскольку приведенная ниже функция работает при повторном использовании:

echo "function hdn { history -d \$1; }">>~/.bashrc

echo "function hdn2 { for i in $(seq 1 \$2); history -d \$1; sleep 1; done; }">>~/.bashrc
0
17.03.2020, 03:33

Пробовал с помощью приведенной ниже команды, все работает нормально

 end=`history| awk 'END{print $1}'`
    start=`history| awk 'END{print $1-10}'`

    awk -v end="$end" -v start="$start"  '{for(i=start;i<=end;i++){print "history -d" " " i};exit}’|sh
0
17.03.2020, 05:12

Что отличается в этом ответе :он также отображает то, что удаляется.

Для тех, кто использует Bash 4.x (, например. в Centos 7 и ниже )я использую это для удаления последних N элементов в истории , включая команду для этого. (здесь N=5)

for i in {1..5}; do echo "clearing line $(($HISTCMD-2)): $(history -p \!$(($HISTCMD-2)))"; history -d $(($HISTCMD-2)); done; history -d $(($HISTCMD-1))

Чтобы удалить строки истории между n и m (, например. здесь 544 и 541 ), я использую следующие. ПРИМЕЧАНИЕ :сначала необходимо ввести больший номер строки, а затем меньший :

.

for i in {544..541}; do echo "clearing line $i: $(history -p \!$i)"; history -d $i; done; history -d $(($HISTCMD-1))

1
08.02.2021, 01:51

Теги

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