LINUX.ORG.RU
ФорумAdmin

Чистка $HISTFILE

 ,


0

2

За длительное время в истории команд копится много дублей. Удалить их можно следующей строкой:

cat $HISTFILE | awk '!($0 in a) {a[$0];print}' > $HISTFILE.tmp && mv -f $HISTFILE.tmp $HISTFILE


Но заметил побочный эффект - портятся строки с кириллицей.
Почему так, и как это можно починить?

man histfile

HISTCONTROL
              A colon-separated list of values controlling how commands are saved on the history list.   If  the  list  of
              values  includes ignorespace, lines which begin with a space character are not saved in the history list.  A
              value of ignoredups causes lines matching the previous history entry to not be saved.  A value of ignoreboth
              is  shorthand  for  ignorespace and ignoredups.  A value of erasedups causes all previous lines matching the
              current line to be removed from the history list before that line is saved.  Any value not in the above list
              is  ignored.  If HISTCONTROL is unset, or does not include a valid value, all lines read by the shell parser
              are saved on the history list, subject to the value of HISTIGNORE.  The second and  subsequent  lines  of  a
              multi-line compound command are not tested, and are added to the history regardless of the value of HISTCON‐
              TROL.

export HISTCONTROL=ignoreboth:erasedups. Толко почистить вручную cat /dev/null > ~/.bash_history && history -c сначала не забудь.

anonymous
()
Ответ на: комментарий от mord0d

У awk нет history.

Всё хорошо. Просто замечательно. Прими таблетки.

anonymous
()

как это можно починить?

Пробуй:

history | wc -l && history -w && awk '!x[$0]++' $HISTFILE > .history.undup && mv -fv .history.undup $HISTFILE && history -c && history -r && history | wc -l
anonymous
()
Ответ на: комментарий от hikikomori

0\ вместо уже придуманных инструментов, ты используешь костыли.

anonymous
()
Ответ на: комментарий от hikikomori

Если кодировку портит awk, то почему ваш вариант не портит?

Когда расшифруешь свой вариант, отвечу.

anonymous
()
Ответ на: комментарий от hikikomori

Если кодировку портит awk, то почему ваш вариант не портит?

Попробую всё-таки угадать. В моём варианте печатается именно строка, а в твоём - некий элемент некого массива.

anonymous
()
Ответ на: комментарий от anonymous

Я не понимаю, чего awk кодировку меняет, если все кроме него в системе в консоли ничего не портят. Ему нужно явно указать кодировку чтоли?

hikikomori ★★★
() автор топика
Ответ на: комментарий от hikikomori

Я не понимаю

Да, не понимаешь. В массиве awk будет хранить данные так, как у него это предусмотрено, и никак иначе. Печатая данные из массива, ты получаешь то, что получаешь, и ничего другого не получишь.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо, первую строку впишу на будущее. Вот за что не люблю маны, так это даже не за английский язык и яйцекголовый стиль изложения, а за недостаточные перекрёстные ссылки, в частности отсутствие в man history ссылки на статью histfile.

А вторая - ловушка для нубов - сохраняет всю имеющуюся историю в /dev/null. Некрасиво так делать.

hikikomori ★★★
() автор топика
Ответ на: комментарий от anonymous

Понял. А указать awk кодировку можно? раз и навсегда? Иначе его функционал по массивам в помойку.

hikikomori ★★★
() автор топика

sort -u <$HISTFILE >$HISTFILE.tmp && mv -f $HISTFILE.tmp $HISTFILE

bass ★★★★★
()
Ответ на: комментарий от anonymous

fliplinux.com машинный говноресурс пасты от надмозга отовсюду. Первое в гугле далеко не часто не то, что ищешь.

hikikomori ★★★
() автор топика
Ответ на: комментарий от anonymous

Вот когда ищешь, нифига не логично. Всё-таки никогда не пойму фанбоев man. Наверное в текстовые квесты на английском не наигрались. Вещь настолько же замечательная, насколько в ней хрен найдешь что сходу, не изучив досконально. А изучив искать уже ничего не надо.

hikikomori ★★★
() автор топика
Ответ на: комментарий от hikikomori

нифига не логично.

Нелогично, пока не знаешь, что history - это фишка shell-а. А что за shell: sh, bash, zsh, fish - это уже тебе решать.

anonymous
()
Ответ на: комментарий от hikikomori

Логично, если бы man history об этом писал.

Ну, какбэ, маны пишут на тулзы. А никакой тулзы history нет. Есть функция shell-а. И у каждого shell-а она своя.

anonymous
()
Ответ на: комментарий от anonymous

Я вот тоже не понимаю, почему awk портит кодировку. Печатается то все равно $0, а не из массива. Причем у меня тоже проблема воспроизводится, а если вместо $HISTFIKE вводить кириллицу с терминала, то она не портится.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Печатается то все равно $0, а не из массива.

Полную раскадровку действий дай. Я лишь говорю то, что смог распасить. А распарсил я, что awk распечатывает некий массив a.

anonymous
()
Ответ на: комментарий от legolegs

print без параметров печатает $0, т.е. входную строку.

Разумеется. И окружение тебя не смутило? Нет? Кстати, никакой раскадровки я так от тебя и не увидел. Не распарсивается?

anonymous
()
Ответ на: комментарий от anonymous

Раскадровку? Ты хочешь, чтобы я объяснил тебе как работает awk? Ну ок: код топикстартера на каждую строку проверяет её наличие в асоциативном массиве, если нету, то переходит к блоку команд, где кладёт строку в массив и печатает её же.

Где здесь может испортиться кодировка я не представляю, но это происходит.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

кладёт строку в массив и печатает её же.

В этом и заключается фокус-покус. Попробуй наоборот.

anonymous
()
Ответ на: комментарий от legolegs

Это vim кодировку не понимает. И только у $HISTFILE. Самое смешное, что у её резервной копии всё понимает.
Если прогнать $HISTFILE.back через строку в начале темы, то опять портится. less видит нормально, а vim кракозябры вместо русских букв.

hikikomori ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.