История Bash без номеров строк

129

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

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

Текущий выход:

  529 man history
  530 ls
  531 ll
  532 clear
  533 cd ~
  534 history

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

Желаемый результат:

man history
ls
ll
clear
cd ~
history

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

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

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

УХО
источник
Могу я спросить, почему cat ~/.bash_historyэто исключено?
flow2k 03

Ответы:

204

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

$ history | cut -c 8-
Пол Р
источник
Можем ли мы передать вывод historyкоманды по конвейеру вместо чтения файла?
cwd
Кажется, работает! Вы можете объяснить, что он делает? Будет ли работать, если числа от 1 до 10 000?
cwd
29
man cut, Он удаляет первые 7 символов каждой строки вывода historyкоманды. Он должен иметь только проблемы , если их число превышает 99999, что - то я никогда не видел (и я использую снаряды много ). Но если вас это беспокоит:history | sed 's/^ *[0-9]* *//'
Кейт Томпсон
1
Я думаю, что решение @Paul R - это то, что мне нужно. Сначала я не осознавал, что команда history cutдополняет номера строк пробелами, и теперь синтаксис становится более понятным :) Спасибо @Keith Thompson за ваше решение, которое будет работать для> 100k историй.
cwd
5
@cwd: Если в вашей истории 100 000 команд, пора отойти от клавиатуры и вернуться домой. Если ты уже дома, выходи на улицу. 8-)} (Да, я знаю, что историю можно сохранять по сеансам.)
Кейт Томпсон,
22

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

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

Этот ответ может потерпеть неудачу, если у вас долгая история.

Жолт Ботыкай
источник
Ха-ха, спасибо - substrэто намного проще, я использовал history | awk '{for (i=2;i<=NF;i++) printf("%s ", $i);print("\r")}'для своего !!
гедублея
17

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

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

zsh> fc -ln 0

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

Att Righ
источник
7
На самом деле fcэто bashтоже встроенный. Единственная разница в том, что первая строка 1, так и будетfc -ln 1
wisbucky
// Проголосуйте за то, что я даже не знал, что существуют альтернативы Bash, долгое время, пока кто-то не поднял их в таком контексте.
Nathan Basanese
11

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

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

Из bash manpage:

       HISTTIMEFORMAT
              Если эта переменная установлена, а не null, ее значение используется как
              строка формата для strftime (3) для печати связанной отметки времени
              с каждой записью истории, отображаемой встроенной историей. Если
              эта переменная установлена, отметки времени записываются в историю
              файл, чтобы они могли сохраняться в сеансах оболочки. Это использует
              символ комментария истории, чтобы отличать отметки времени от
              другие строки истории.

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

IMIL
источник
Немного проще, используя более непонятный синтаксис:HISTTIMEFORMAT=$'\r\e[K'
wjandrea
5
И однострочный вариант:HISTTIMEFORMAT=$'\r\e[K' history
wjandrea
5

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

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

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

alias history="history | sed 's/^[ ]*[0-9]\+[ ]*//'"
Мэнни Д
источник
1
\+в базовом регулярном выражении не соответствует стандарту POSIX. Используйте, \{1,\}если вы sedне поддерживаете нестандартное \+расширение.
Ричард Хансен
4

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

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

ИЛИ

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

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

print $0эквивалентно print, поскольку по умолчанию печатается все, что появляется в строке. Набор текста print $0более явный, но какой из них вы выберете, зависит от вас. Поведение print $0and simple 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!

[Пример] Использование 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."
СААВ-V
источник
4
history -w /dev/stdout

Из вывода history --help:

-w записать текущую историю в файл истории

Он записывает текущую историю в указанный файл - /dev/stdoutв данном случае.

Черни
источник
3

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

Пример :

history | cut -d' ' -f4- | sed 's/^ \(.*$\)/\1/g'
кольцо предъявитель
источник
3
Если вы все sedравно собираетесь прогнать его , тогда начальный разрез будет лишним - просто добавьте его вместо этого в выражение.
moopet
2
$ hh -n

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

введите описание изображения здесь

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

Мартин Дворак
источник
1

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

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

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

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

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

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

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

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

GEOKING
источник
0

Я знаю, что опаздываю на вечеринку, но это намного легче запомнить:

cat ~/.bash_history
Майк Слинн
источник
Верно, но вторая строка OP: «Дело в том, чтобы использовать команду history, поэтому, пожалуйста, не отвечайте cat ~ / .bash_history»
Чирео