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

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

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

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

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

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

Требуемый выход:

man history
ls
ll
clear
cd ~
history

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

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

Я также хотел поделиться замечательной статьей, которую я нашел сегодня утром. В нем есть несколько хороших параметров, которые я использую сейчас, например, сохранение повторяющихся записей из истории bash и обеспечение того, чтобы несколько сеансов bash не перезаписывали файл истории: < а2 >

Ответ 1

Попробуйте следующее:

$ history | cut -c 8-

Ответ 2

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

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

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

Ответ 3

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

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

zsh> fc -ln 0

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

Ответ 4

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

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

От bash 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

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

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

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

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

Ответ 6

Команда

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

Пример:

history | cut -d' ' -f4- | sed 's/^ \(.*$\)/\1/g'

Ответ 7

$ hh -n

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

enter image description here

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

Ответ 8

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

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

ИЛИ

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

Оба этих решения делают то же самое. Вывод истории подается на awk. Затем Awk вычеркивает первый столбец, который соответствует номерам в выводе команды истории. Здесь 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."

Ответ 9

Вы можете использовать команду 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

Ответ 10

Я проходил эту тему и нашел, что решения хороши. При попытке решения awk найти, что в истории, если есть многолинейные команды, есть или пробелы и т.д., У них могут возникнуть проблемы с печатью фактического требования OP. Позвольте мне привести пример здесь, я выполнил команду вроде этого.

awk '
match ($0, /<property class="java.lang.String" name="WorkJobNumber" value="[0-9]*"\/>/) {sub (substr ($0, RSTART+63, RLENGTH-66), _)
                                                                                        }
1123
'  Input_file

Таким образом, в истории он будет находиться под 1 порядковым номером, но может быть проблемой, если это не учтено в решении/с. Поэтому следующее может избежать ситуации, когда были запущены специальные команды с несколькими линиями.

history | awk '{Q=$1;sub(/^[[:space:]]+/,"",Q);if(LAST+1==Q && LAST && Q ~ /^[0-9]+/){;$1="";print;} else {print;};if(Q ~ /^[0-9]+/ && Q+0 == LAST+1 && $0 !~ /^$/){LAST=Q+0};next} (Q ~ /^[0-9]+/ && $0 !~ /^$/){LAST=Q+0} 1'

Нелинейная форма решения также выглядит следующим образом:

history | awk '{
        Q=$1;
        sub(/^[[:space:]]+/,"",Q);
        if(LAST+1==Q && LAST && Q ~ /^[0-9]+/){;
                            $1="";
                            print;
                              } 
                else                                  {
                            print;
                                  };
                if(Q ~ /^[0-9]+/ && Q+0 == LAST+1 && $0 !~ /^$/){
                                 LAST=Q+0
                                        };
                next
               } 
               (Q ~ /^[0-9]+/ && $0 !~ /^$/){
                             LAST=Q+0
                                            } 
               1
              '

Объяснение вышеприведенного кода также выглядит следующим образом (один из них не должен выполняться следующим образом, поскольку он предназначен только для объяснения):

history |                                          #### Running history command here and using pipe to use this command standard output to standard input for next awk command.
awk '                                              #### Starting awk command from here.
{Q=$1                                              #### Starting a variable named Q, whose value is $1 of current line.
sub(/^[[:space:]]+/,"",Q)                          #### subsitute initial space of variable Q(which has $1 of current line too) to NULL now.
if(LAST+1==Q && LAST && Q ~ /^[0-9]+/)             #### mentioning here a if condition which is checking following conditions.
                                                 i- check if variable named LAST value +1 is equal to variable Q value(where LAST variable is the variable which has previous line number.
                                                ii- check LAST value should NOT be NULL.
                                               iii- check  variable Q value should be always starting from digits(As running multi-lie commands eg--> awk you could have commands there so making sure our LAST variable doesn't have any junk in it).
{;$1="";print;}                                    #### making $1 value NULL so that history number will not print and then printing the current line.
else                                               #### Mentioning else, in case above if condition is NOT TRUE then following statements should execute.
{;print}                                           #### simply print the current line.
;if(Q ~ /^[0-9]+/ && Q+0 == LAST+1 && $0 !~ /^$/)  #### checking following conditions here.
                                                 i- check if variable Q value always starts from digits to make sure no junk will come apart from history numbers in variable here.
                                                ii- check Q+0 == LAST+1, here Q+0 I am mentioning because in my history it was showing 772*(in a row) so Q+0 will make sure only numbers are being captured here. then comparing it with LAST+1 value, if both are equal here.
                                               iii- Making sure each line starts NOT from a space(in multi-line commands you may see spaces).
{LAST=Q+0};next}                                   #### Assigning variable LAST value to Q value(by doing Q+0 making sure like only digits should be captured here). Mentioning next here which is awk in-built keyword and will skip all next statements then.
(Q ~ /^[0-9]+/ && $0 !~ /^$/)                      #### This condition will be executed when previous are not true, checking Q value should be starting from digits only to get the history sequence number only and checking a line shouldn't start from space etc.
{LAST=Q+0}                                         #### Assigning variable LAST value to value of Q+0 which will make sure only digits should come.
1'                                                 #### So awk works on pattern{action} method, so by mentioning 1 I am making a pattern/condition true and then not mentioning any action here so by default print action will happen and it will print the current line, it will happen only in those cases when a history doesn't have any sequence number in it.

Хотя эта команда может иметь некоторые проблемы, попробовал мой BEST, чтобы она была безупречной, открытая для обратной связи или предложений.