История Bash без номеров строк - PullRequest
108 голосов
/ 18 августа 2011

Команда bash history очень крутая. Я понимаю, почему он показывает номера строк, но есть ли способ, которым я могу вызвать команду истории и подавить номера строк?

Смысл в том, чтобы использовать команду истории, поэтому, пожалуйста, не отвечайте cat ~/.bash_history

Токовый выход:

  529 man history
  530 ls
  531 ll
  532 clear
  533 cd ~
  534 histor<em>y</em>

Исторический графический источник.

Желаемый вывод:

man history
ls
ll
clear
cd ~
histor<em>y</em>

Исторический графический источник.

Спасибо всем за ваши великолепные решения. Paul's самый простой и будет работать для меня, потому что мой размер истории bash установлен на 2000.

Я также хотел поделиться классной статьей, которую нашел сегодня утром. У него есть несколько хороших опций, которые я сейчас использую, например, удаление дублирующих записей из истории Bash и проверка того, что несколько сеансов Bash не перезаписывают файл истории: http://blog.macromates.com/2008/working-with-history-in-bash/

Ответы [ 9 ]

172 голосов
/ 18 августа 2011

Попробуйте это:

$ history | cut -c 8-
17 голосов
/ 18 августа 2011

awk может помочь:

history|awk '{$1="";print substr($0,2)}'

Этот ответ может дать сбой, если у вас длинная история.

12 голосов
/ 12 марта 2017

Я прекрасно знаю, что этот вопрос касается bash, и многие люди предпочли бы не переключаться на zsh (cue downvotes ...)

Однако, если вы готовы перейти на zsh тогда zsh поддерживает это изначально (а также другие опции для форматирования истории)

zsh> fc -ln 0

(см. https://serverfault.com/questions/114988/removing-history-or-line-numbers-from-zsh-history-file)

11 голосов
/ 29 апреля 2017

Я опаздываю на этом, но более короткий способ будет добавить следующее в ваш ~/.bashrc или ~/.profile файл:

HISTTIMEFORMAT="$(echo -e '\r\e[K')"

Из Баш manpage:

HISTTIMEFORMAT
              If this variable is set and not null, its value is used as a
              format string for strftime(3) to print the time stamp associated
              with each history entry displayed by the history builtin.  If
              this variable is set, time stamps are written to the history
              file so they may be preserved across shell sessions.  This uses
              the history comment character to distinguish timestamps from
              other history lines.

Используя эту возможность, умный взлом состоит в том, чтобы заставить переменную «напечатать» возврат каретки (\r) и очистить строку (код ANSI K) вместо фактическогометка времени.

5 голосов
/ 18 августа 2011

В качестве альтернативы вы можете использовать sed:

history | sed 's/^[ ]*[0-9]\+[ ]*//'

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

alias history="history | sed 's/^[ ]*[0-9]\+[ ]*//'"
3 голосов
/ 18 августа 2011
Команда

history не имеет опции подавления номеров строк. Вам нужно будет объединить несколько команд, как предлагают все:

Пример:

history | cut -d' ' -f4- | sed 's/^ \(.*$\)/\1/g'
2 голосов
/ 21 января 2017

Хотя обрезка с опцией -c работает для большинства практических целей, я думаю, что история конвейеризации в awk была бы лучшим решением. Например:

history | awk '{ $1=""; print }'

OR

history | awk '{ $1=""; print $0 }'

Оба эти решения делают одно и то же. Вывод истории подается в awk. Затем Awk очищает первый столбец, который соответствует числам в выводе команды history. Здесь awk более удобен, потому что вам не нужно беспокоиться о количестве символов в числовой части вывода.

print $0 эквивалентно print, поскольку по умолчанию печатается все, что появляется в строке. Ввод print $0 более точный, но какой вы выберете, решать вам. Поведение print $0 и просто print при использовании с awk более очевидно, если вы используете awk для печати файла (cat будет быстрее печатать вместо awk, но это для иллюстрации точки).

[Ex] Использование awk для отображения содержимого файла с $ 0

$ awk '{print $0}' /tmp/hello-world.txt
Hello World!

[Ex] Использование awk для отображения содержимого файла без явных $ 0

$ awk '{print}' /tmp/hello-world.txt
Hello World!

[Ex] Использование awk, когда строка истории занимает несколько строк

$ history
   11  clear
   12  echo "In word processing and desktop publishing, a hard return or paragraph break indicates a new paragraph, to be distinguished from the soft return at the end of a line internal to a paragraph. This distinction allows word wrap to automatically re-flow text as it is edited, without losing paragraph breaks. The software may apply vertical whitespace or indenting at paragraph breaks, depending on the selected style."

$ history | awk ' $1=""; {print}'
 clear
 echo "In word processing and desktop publishing, a hard return or paragraph break indicates a new paragraph, to be distinguished from the soft return at the end of a line internal to a paragraph. This distinction allows word wrap to automatically re-flow text as it is edited, without losing paragraph breaks. The software may apply vertical whitespace or indenting at paragraph breaks, depending on the selected style."
2 голосов
/ 29 мая 2015
$ hh -n

Возможно, вы захотите попробовать https://github.com/dvorka/hstr, который позволяет выполнять фильтрацию истории Bash в «стиле коробки» с (опционально) упорядочением по метрикам, т.е. он намного более эффективен и быстрее как в прямом, так и в обратном направлении.:

enter image description here

Его можно легко связать с Ctrl-r и / или Ctrl-s

1 голос
/ 18 августа 2017

Вы можете использовать команду cut для ее решения:

Вырезать поля из STDIN или файлов.

  • Вырежьте первые шестнадцать символов в каждой строке STDIN: cut -c 1-16

  • Вырежьте первые шестнадцать символов в каждой строке указанных файлов: cut -c 1-16 file

  • Вырезать все от 3-го символа до конца каждой строки: cut -c3-

  • Вырежьте пятое поле каждой строки, используя двоеточие в качестве разделителя полей (разделитель по умолчанию - tab) cut -d':' -f5

  • Вырежьте 2-е и 10-е поля каждой строки, используя точку с запятой в качестве разделителя: cut -d';' -f2,10

  • Вырежьте поля с 3 по 7 каждой строки, используя пробел в качестве разделителя: cut -d' ' -f3-7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...