Как я могу удалить дубликаты в своем .bash_history, сохранив порядок?

Возможно, использование "набора" является неподходящим?

Да, существует Ваша проблема. set не делает то, что Вы могли бы ожидать. Из документации:

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

Отметьте заметное отсутствие "на самом деле переменных оболочки набора" в том списке вещей, которые это делает. Проложенный под землей во всех документах, Вы найдете, что то, что это делает, устанавливает позиционные параметры оболочки на аргументы, которые Вы дали. Вы просто даете один аргумент, весь из MONGODB="/usr/local/mongodb/bin". Так $1 установлен на это (и $# установлен на 1, так как существует только один аргумент).

Выиграть один за антимнемонические названия команды Unix, ха?

Так так или иначе попробуйте просто:

MONGODB=/usr/local/mongodb/bin
export PATH=${PATH}:${MONGODB}

и это будет работать.

63
20.09.2012, 17:55
6 ответов

Сортировка истории

Эта команда работает как sort|uniq, но удерживает строки на месте

nl|sort -k 2|uniq -f 1|sort -n|cut -f 2

В основном, предварительно ожидает к каждой строке его число. После sort|uniq- луг, все строки отсортированы назад согласно их первоначальному заказу (использующий поле номера строки), и поле номера строки удалено из строк.

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

nl|sort -k2 -k 1,1nr|uniq -f1|sort -n|cut -f2

Управление .bash_history

Для перечитывания и обратной записи истории, можно использовать history -a и history -w соответственно.

36
27.01.2020, 19:32
  • 1
    версия decorate-sort-undecorate, реализованного с инструментами оболочки.Мило. –  ire_and_curses 20.09.2012, 20:21
  • 2
    С sort, -r переключитесь всегда инвертирует порядок сортировки. Но это не приведет к результату, который Вы имеете в виду. sort расценивает два случаев ls как идентичный, так что в итоге, даже когда инвертировано, возможный порядок зависит от алгоритма сортировки. Но посмотрите мое обновление для другой идеи. –  artistoex 20.09.2012, 22:29
  • 3
    В случае, если, Вы не хотите изменять .bash_history, Вы могли поместить следующее в .bashrc: история псевдонима ='history | вид-k2-k 1,1nr | uniq-f 1 | вид-n' –  Nathan 15.01.2014, 22:35
  • 4
    Что nl в начале каждой строки кода? Не был должен это быть history? –  A.L 04.02.2015, 11:50
  • 5
    @A.L nl добавляет номера строки. Команда в целом решает общую проблему: удаление дубликатов при сохранении порядка. Вход читается из stdin. –  artistoex 05.02.2015, 23:24

Найденный этим решением в дикой природе и протестированный:

awk '!x[$0]++'

В первый раз, когда определенное значение строки (0$) замечено, значение x [0$] является нулем.
Значение нуля инвертируется с ! и становится тем.
Оператор, который оценивает, каждый вызывает действие по умолчанию, которое является печатью.

Поэтому в первый раз определенное $0 замечен, это печатается.

В каждый следующий раз (повторения) значение x[$0] был incrented,
его отрицаемое значение является нулем, и оператор, который оценивает для обнуления, не печатает.

Для хранения последнего повторного значения инвертируйте историю и используйте тот же awk:

awk '!x[$0]++' ~/.bash_history                 # keep the first value repeated.

tac ~/.bash_history | awk '!x[$0]++' | tac     # keep the last.
18
27.01.2020, 19:32
  • 1
    Ничего себе! Это просто работало. Но это удаляет все кроме первого вхождения, которое я предполагаю. Я инвертировал упорядочивание строк с помощью Сублимированного текста прежде, чем выполнить это. Теперь я инвертирую его снова для получения чистой истории только с последним вхождением всех оставленных позади дубликатов.Спасибо. –  trss 27.08.2014, 23:05
  • 2
    Проверьте мой ответ! –  Ali Shakiba 19.01.2015, 12:26

Они сохранили бы последние дублированные строки:

ruby -i -e 'puts readlines.reverse.uniq.reverse' ~/.bash_history
tac ~/.bash_history | awk '!a[$0]++' | tac > t; mv t ~/.bash_history
4
27.01.2020, 19:32

Удлинение Clayton Ответ:

tac $HISTFILE | awk '!x[$0]++' | tac | sponge $HISTFILE

TAC Образование файла, убедитесь, что вы установили TORETILS , так что у вас есть губку Используйте TEMP-файл.

9
27.01.2020, 19:32

Итак, я искал то же самое после того, как меня раздражали дубликаты, и обнаружил, что если я отредактирую свой ~ / .bash_profile (Mac) с помощью:

export HISTCONTROL=ignoreboth:erasedups

Он делает именно то, что вы хотели, он сохраняет только самую последнюю команду. ignoreboth на самом деле аналогичен выполнению ignorespace: ignoredups , и это вместе с erasedups выполняет свою работу.

По крайней мере, на моем Mac-терминале с bash эта работа отлично работает. Нашел здесь, на askubuntu.com .

52
27.01.2020, 19:32

Однозначно записывать каждую новую команду сложно. Сначала нужно добавить в ~/.profileили аналогичный:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Затем нужно добавить к~/.bash_logout:

history -a
history -w
0
27.01.2020, 19:32

Теги

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