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 /

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

Respostas:

204

Tente o seguinte:

$ history | cut -c 8-
Paul R
fonte
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.

Zsolt Botykai
fonte
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 )

Att Righ
fonte
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.

iMil
fonte
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]\+[ ]*//'"
Manny D
fonte
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."
Suave-V
fonte
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.

Czerny
fonte
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'
portador de anel
fonte
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

Martin Dvorak
fonte
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

GEOKING
fonte
0

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

cat ~/.bash_history
Mike Slinn
fonte
Verdade, mas a segunda linha do OP: "O objetivo aqui é usar o comando history, portanto, não responda cat ~ / .bash_history"
Cireo