Histórico do Bash sem números de linha


129

O historycomando bash é muito legal. Entendo por que ele mostra os números das linhas, mas existe uma maneira de chamar o comando history e suprimir os números das linhas?

O ponto aqui é usar o comando history, portanto, não responda cat ~/.bash_history

Saída atual:

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

Fonte gráfica histórica.

Saída desejada:

man history
ls
ll
clear
cd ~
history

Fonte gráfica histórica.

Obrigado a todos por suas ótimas soluções. O Paul é o mais simples e funcionará para mim porque meu tamanho do histórico do bash é definido em 2000.

Eu também queria compartilhar um artigo interessante que encontrei esta manhã. Agora, estou usando algumas boas opções, como manter entradas duplicadas fora do histórico do bash e garantir que várias sessões do bash não sobrescrevam o arquivo do histórico: http://blog.macromates.com/2008/working-with -history-in-bash /


Posso perguntar por que cat ~/.bash_historyestá descartada?
— flow2k

Respostas:


204

Tente o seguinte:

$ history | cut -c 8-

Podemos canalizar a saída do historycomando em vez de ler o arquivo?
— Cwd

Parece funcionar! Você pode explicar o que está fazendo? Funcionará se os números forem de 1 a 10.000?
— Cwd

29
man cut. Está excluindo os 7 primeiros caracteres de cada linha de saída do historycomando. Só deve ter problemas se o número exceder 99.999, algo que nunca vi (e uso muito conchas ). Mas se você está preocupado com isso:history | sed 's/^ *[0-9]* *//'
— Keith Thompson

1
Acho que a solução de @Paul R é o que eu preciso. Inicialmente, não percebi que o comando history estava preenchendo os números de linha com espaços e agora a cutsintaxe faz mais sentido :) Obrigado @Keith Thompson pela solução que funcionará para mais de 100 mil históricos.
— Cwd

5
@cwd: Se você possui 100.000 comandos em seu histórico, é hora de se afastar do teclado e voltar para casa. Se você já está em casa, vá lá fora. 8-)} (Sim, eu sei que a história pode ser mantido através de sessões).
— Keith Thompson

22

awk pode ajudar:

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

Esta resposta pode falhar se você tiver um longo histórico.


Ha Ha, obrigado - substré muito mais simples, eu tenho usado history | awk '{for (i=2;i<=NF;i++) printf("%s ", $i);print("\r")}'para o meu !!
— geedoubleya

17

Estou bem ciente de que esta pergunta é para o bash e muitas pessoas preferem não mudar para o zsh (cue downvotes ...)

No entanto, se você estava disposto a mudar para o zsh , o zsh suporta isso de forma nativa (assim como outras opções para formatação de histórico)

zsh> fc -ln 0

(Consulte /server/114988/removing-history-or-line-numbers-from-zsh-history-file )


7
Na verdade, fcé um bashbuiltin também. A única diferença é que a primeira linha é 1, por isso seriafc -ln 1
— wisbucky

//, Tenha um voto positivo pelo fato de eu nem saber que havia alternativas ao Bash por um longo tempo, até que alguém as trouxe em um contexto como este.
— Nathan Basanese 7/03/18

11

Estou atrasado neste, mas o método mais curto seria adicionar o seguinte no seu arquivo ~/.bashrcou ~/.profile:

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

Do bash manpage:

       HISTTIMEFORMAT
              Se essa variável estiver configurada e não nula, seu valor será usado como um
              sequência de formato para strftime (3) para imprimir o carimbo de hora associado
              com cada entrada do histórico exibida pelo histórico incorporado. E se
              esta variável é definida, os carimbos de hora são gravados no histórico
              para que eles possam ser preservados nas sessões do shell. Isso usa
              o caractere de comentário da história para distinguir timestamps de
              outras linhas da história.

Usando esse recurso, um hack inteligente consiste em tornar a variável "imprimir" um retorno de carro ( \r) e limpar a linha (código ANSI K) em vez de um carimbo de data / hora real.


Um pouco mais simples, usando a sintaxe mais obscuro:HISTTIMEFORMAT=$'\r\e[K'
— wjandrea

5
E uma opção de uma linha:HISTTIMEFORMAT=$'\r\e[K' history
— wjandrea

5

Como alternativa, você pode usar o sed:

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

Usando o alias, você pode definir isso como seu padrão (cole-o no seu bash_profile):

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

1
\+em uma expressão regular básica não é compatível com POSIX. Use \{1,\}se o seu sednão suportar a \+extensão não padrão .
— Richard Hansen

4

Embora o corte com a -copção funcione para os propósitos mais práticos, acho que canalizar o histórico para o awk seria uma solução melhor. Por exemplo:

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

OU

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

Ambas as soluções fazem a mesma coisa. A saída da história está sendo alimentada pelo awk. O Awk apaga a primeira coluna, que corresponde aos números na saída do comando history. Aqui, o awk é mais conveniente porque você não precisa se preocupar com o número de caracteres na parte numérica da saída.

print $0é equivalente a print, já que o padrão é imprimir tudo o que aparece na linha. A digitação print $0é mais explícita, mas qual você escolhe depende de você. O comportamento de print $0e simplesmente printquando usado com o awk é mais evidente se você usou o awk para imprimir um arquivo ( catseria mais rápido digitar em vez do awk, mas isso é apenas para ilustrar um ponto).

[Ex] Usando o awk para exibir o conteúdo de um arquivo com $ 0

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

[Ex] Usando o awk para exibir o conteúdo de um arquivo sem $ 0 explícito

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

[Ex] Usando awk quando a linha do histórico abrange várias linhas

$ 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."

4
history -w /dev/stdout

Da saída de history --help:

-w grava o histórico atual no arquivo de histórico

Ele grava o histórico atual no arquivo especificado - /dev/stdoutneste caso.


3

historyO comando não tem uma opção para suprimir os números de linha. Você terá que combinar vários comandos, pois todo mundo está sugerindo:

Exemplo:

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

3
Se você for executá-lo de sedqualquer maneira, o corte inicial será redundante - basta adicioná-lo à expressão.
— moopet

2
$ hh -n

Você pode tentar https://github.com/dvorka/hstr, que permite a filtragem "sugerir estilo de caixa" do histórico do Bash com pedidos baseados em métricas (opcionais), ou seja, é muito mais eficiente e mais rápido nas direções para a frente e para trás:

insira a descrição da imagem aqui

Pode ser facilmente ligado Ctrl-re / ouCtrl-s


1

Você pode usar o comando cutpara resolvê-lo:

Recorte os campos do STDIN ou dos arquivos.

  • Recorte os dezesseis primeiros caracteres de cada linha de STDIN: cut -c 1-16

  • Recorte os dezesseis primeiros caracteres de cada linha dos arquivos fornecidos: cut -c 1-16 file

  • Recorte tudo, desde o terceiro caractere até o final de cada linha: cut -c3-

  • Recorte o quinto campo de cada linha, usando dois pontos como delimitador de campo (o delimitador padrão é a guia): cut -d':' -f5

  • Recorte os 2º e 10º campos de cada linha, usando um ponto e vírgula como delimitador: cut -d';' -f2,10

  • Recorte os campos 3 a 7 de cada linha, usando um espaço como delimitador: cut -d' ' -f3-7


0

Eu sei que estou atrasado para a festa, mas isso é muito mais fácil de lembrar:

cat ~/.bash_history

Verdade, mas a segunda linha do OP: "O objetivo aqui é usar o comando history, portanto, não responda cat ~ / .bash_history"
— Cireo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.