Как я могу получить последний номер строки уникальных команд, когда grepping мой файл истории?

Я полагаюсь на свой файл истории для предыдущих команд, особенно тех, которые длинны со многими параметрами. Как только я нахожу команду и ее номер строки ( nn ), я использую !nn для ее запуска. Я предпочитаю видеть полный вывод из поиска, а не делать обратный поиск в строке.

Для этого я просматриваю его с помощью history | grep some_text history | grep some_text

Однако я получаю много результатов из-за повторяющихся записей (отличающихся только номерами строк). По мере роста моей истории это ухудшается с течением времени.

Как я мог получить список только уникальных команд, которые я мог бы использовать с помощью ! вызвать команду оператора?

Я пробовал историю | uniq | grep some_text, но это не работает из-за номеров строк.

Я могу сделать history | cut -b8- | uniq history | cut -b8- | uniq history | cut -b8- | uniq и это показывает только команды.
Однако, когда я добавляю sort я получаю $ history | sort sort: string comparison failed: Illegal byte sequence sort: Set LC_ALL='C' to work around the problem. sort: The strings compared were $ history | sort sort: string comparison failed: Illegal byte sequence sort: Set LC_ALL='C' to work around the problem. sort: The strings compared were $ history | sort sort: string comparison failed: Illegal byte sequence sort: Set LC_ALL='C' to work around the problem. sort: The strings compared were Сравнение $ history | sort sort: string comparison failed: Illegal byte sequence sort: Set LC_ALL='C' to work around the problem. sort: The strings compared were 5359 \ 253 'и 5360 x'.
Также номера строк исчезли, что я действительно хотел бы для команды !line-number

В идеале я бы хотел, чтобы это происходило каждый раз, когда я делаю свою history | grep history | grep – что я делаю так, у меня есть псевдоним hg='history | grep ' hg='history | grep ' поэтому я мог бы добавить любое решение для этого.

Менее идеальным, но все же интересным будет возможность запуска специальной программы, которая фактически сделает записи в файле истории уникальными (опять же, имея дело с номерами строк), так что только самая последняя команда истории любой данной команды сохранена). предположительно, удалив другие строки. Но удалили ли строки в файле истории таким образом испортить способ использования файла системой?

3 Solutions collect form web for “Как я могу получить последний номер строки уникальных команд, когда grepping мой файл истории?”

Ты можешь сказать:

 history | awk '{$1=""; sub("^ ", "", $0)}1' | sort -u 

чтобы получить список уникальных записей в history .

Однако вы также можете установить HISTCONTROL чтобы избежать дубликатов в history :

 HISTCONTROL=ignoredups:erasedups 

Цитата из руководства :

HISTCONTROL

Обозначенный двоеточием список значений, определяющий, как команды сохраняются в списке истории. Если в список значений входит « ignorespace », строки, начинающиеся с символа пробела, не сохраняются в списке истории. Значение « ignoredups » заставляет строки, которые соответствуют предыдущей записи истории, не сохраняться. Значение « ignoreboth » является сокращением для « ignorespace » и « ignoredups ». Значение « erasedups » заставляет все предыдущие строки, соответствующие текущей строке, удаляться из списка истории до того, как эта строка будет сохранена. Любое значение, не указанное в приведенном выше списке, игнорируется. Если HISTCONTROL отключен или не содержит допустимого значения, все строки, считанные синтаксическим анализатором оболочки, сохраняются в списке хронологии с учетом значения HISTIGNORE . Вторая и последующая строки многострочной составной команды не тестируются и добавляются в историю независимо от значения HISTCONTROL .

Вы можете проанализировать файл .bash_history , вместо использования команды history . Вот пример в awk :

 awk '!x[$0]++' .bash_history | nl 

Но, как и ответ @ devnull, вы должны использовать HISTCONTROL чтобы избежать дублирования команды, а также команды, которые начинаются с spaces :

 HISTCONTROL=ignoreboth 

в моей системе uniq имеет возможность пропускать поля.

 history | uniq -f 1 

дает мне уникальный список моей истории с номерами строк

моя версия:

 uniq (GNU coreutils) 8.15 

Однако это только опускает параллельные дубликаты, поэтому я бы действительно сортировал вывод истории, а затем uniq it:

 history | sort -k 2 | uniq -f 1 | sort -n 

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

  • получить список месяцев, используя dseq from dateutils
  • Почему эти ценности не могут быть объединены вместе?
  • Почему uniq игнорирует Unicode и строки с одной буквой?
  • Удаление строк с одним общим полем
  • Разница между использованием `sort -u` и` sort | uniq -u`
  • Uniq не удалит дубликат
  • Как использовать grep, sort и uniq для создания трех полей вывода
  • Сортировка не использует естественный порядок
  • Комбинация uniq и agrep?
  • Использование Uniq -c с регулярным выражением или подсчет количества удаленных строк
  • Подключения к серверу мониторинга - проблема форматирования Netstat
  • Linux и Unix - лучшая ОС в мире.