Historial de bash sin números de línea

129

El historycomando bash es muy bueno. Entiendo por qué muestra los números de línea, pero ¿hay alguna forma de invocar el comando de historial y suprimir los números de línea?

El punto aquí es usar el comando de historial, así que no responda cat ~/.bash_history

Salida de corriente:

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

Fuente gráfica histórica.

Salida deseada:

man history
ls
ll
clear
cd ~
history

Fuente gráfica histórica.

Gracias a todos por sus excelentes soluciones. Paul's es el más simple y funcionará para mí porque el tamaño de mi historial de bash está establecido en 2000.

También quería compartir un artículo genial que encontré esta mañana. Tiene un par de buenas opciones que ahora estoy usando, como mantener las entradas duplicadas fuera del historial de bash y asegurarme de que varias sesiones de bash no sobrescriban el archivo de historial: http://blog.macromates.com/2008/working-with -history-in-bash /

cwd
fuente
¿Puedo preguntar por qué cat ~/.bash_historyse descarta?
flow2k

Respuestas:

204

Prueba esto:

$ history | cut -c 8-
Paul R
fuente
¿Podemos canalizar la salida del historycomando en lugar de leer el archivo?
cwd
¡Parece funcionar! ¿Puedes explicar lo que está haciendo? ¿Funcionará si los números son 1 - 10,000?
cwd
29
man cut. Está eliminando los primeros 7 caracteres de cada línea de salida del historycomando. Solo debería tener problemas si el número supera los 99,999, algo que nunca he visto (y uso mucho los shells ). Pero si le preocupa eso:history | sed 's/^ *[0-9]* *//'
Keith Thompson
1
Creo que la solución de @Paul R es lo que necesito. Al principio no me di cuenta de que el comando de historial estaba rellenando los números de línea con espacios y ahora la cutsintaxis tiene más sentido :) Gracias @Keith Thompson por su solución que funcionará para> 100k historiales.
cwd
55
@cwd: si tiene 100,000 comandos en su historial, es hora de alejarse del teclado e irse a casa. Si ya estás en casa, ve afuera. 8-)} (Sí, sé que la historia se puede retener en todas las sesiones.)
Keith Thompson
22

awk poder ayudar:

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

Esta respuesta puede fallar si tienes una larga historia.

Zsolt Botykai
fuente
¡Ja, ja, gracias, substres mucho más simple, lo he estado usando history | awk '{for (i=2;i<=NF;i++) printf("%s ", $i);print("\r")}'para el mío!
geedoubleya
17

Soy bastante consciente de que esta pregunta es para bash y muchas personas preferirían no cambiar a zsh (cue downvotes ...)

Sin embargo, si estaba dispuesto a cambiar a zsh, entonces zsh lo admite de forma nativa (así como otras opciones para formatear el historial)

zsh> fc -ln 0

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

Att Righ
fuente
77
En realidad, también fces un bashincorporado. La única diferencia es que la primera línea es 1, por lo que seríafc -ln 1
wisbucky
//, ten un voto positivo por el hecho de que ni siquiera sabía que había alternativas a Bash por mucho tiempo hasta que alguien las mencionó en un contexto como este.
Nathan Basanese
11

Llego tarde en este caso, pero el método más corto sería agregar lo siguiente en su archivo ~/.bashrco ~/.profile:

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

De bash manpage:

       HISTTIMEFORMAT
              Si esta variable se establece y no es nula, su valor se utiliza como
              formatear cadena para strftime (3) para imprimir la marca de tiempo asociada
              con cada entrada del historial mostrada por el historial incorporado. Si
              esta variable está configurada, las marcas de tiempo se escriben en el historial
              archivo para que puedan conservarse en las sesiones de shell. Esto usa
              el carácter de comentario histórico para distinguir las marcas de tiempo de
              Otras líneas de la historia.

Usando esta capacidad, un truco inteligente consiste en hacer que la variable "imprimir" sea un retorno de carro ( \r) y borrar la línea (código ANSI K) en lugar de una marca de tiempo real.

iMil
fuente
Un poco más simple, utilizando la sintaxis más oscuro:HISTTIMEFORMAT=$'\r\e[K'
wjandrea
55
Y una opción de una línea:HISTTIMEFORMAT=$'\r\e[K' history
wjandrea
5

Alternativamente, podría usar sed:

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

Usando alias, puede establecer esto como su estándar (pegarlo en su bash_profile):

alias history="history | sed 's/^[ ]*[0-9]\+[ ]*//'"
Manny D
fuente
1
\+en una expresión regular básica no es POSIX conforme. Úselo \{1,\}si sedno admite la \+extensión no estándar .
Richard Hansen el
4

Aunque cortar con la -copción funciona para la mayoría de los propósitos prácticos, creo que el historial de tuberías a awk sería una mejor solución. Por ejemplo:

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

O

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

Ambas soluciones hacen lo mismo. La salida de la historia se está enviando a awk. Awk luego deja en blanco la primera columna, que corresponde a los números en la salida del comando de historial. Aquí awk es más conveniente porque no tiene que preocuparse por la cantidad de caracteres en la parte numérica de la salida.

print $0es equivalente a print, ya que el valor predeterminado es imprimir todo lo que aparece en la línea. Escribir print $0es más explícito, pero el que elijas depende de ti. El comportamiento de print $0y simplemente printcuando se usa con awk es más evidente si usó awk para imprimir un archivo ( catsería más rápido escribir en lugar de awk, pero esto es para ilustrar un punto).

[Ej] Usando awk para mostrar el contenido de un archivo con $ 0

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

[Ex] Usar awk para mostrar el contenido de un archivo sin $ 0 explícito

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

[Ex] Usar awk cuando la línea del historial abarca varias líneas

$ 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
fuente
4
history -w /dev/stdout

De salida de history --help:

-w escribe el historial actual en el archivo de historial

Escribe el historial actual en el archivo especificado, /dev/stdouten este caso.

Czerny
fuente
3

historyEl comando no tiene una opción para suprimir los números de línea. Tendrá que combinar varios comandos como todos sugieren:

Ejemplo:

history | cut -d' ' -f4- | sed 's/^ \(.*$\)/\1/g'
portador del anillo
fuente
3
Si lo va a ejecutar de sedtodos modos, entonces el corte inicial es redundante, simplemente agréguelo a la expresión.
moopet
2
$ hh -n

Es posible que desee probar https://github.com/dvorka/hstr que permite el filtrado de "estilo de cuadro de sugerencia" del historial de Bash con un orden basado en métricas (opcional), es decir, es mucho más eficiente y más rápido tanto en dirección hacia adelante como hacia atrás:

ingrese la descripción de la imagen aquí

Se puede unir fácilmente Ctrl-ry / oCtrl-s

Martin Dvorak
fuente
1

Puede usar el comando cutpara resolverlo:

Recorte campos de STDIN o archivos.

  • Recorte los primeros dieciséis caracteres de cada línea de STDIN: cut -c 1-16

  • Recorte los primeros dieciséis caracteres de cada línea de los archivos dados: cut -c 1-16 file

  • Recorta todo, desde el tercer personaje hasta el final de cada línea: cut -c3-

  • Recorte el quinto campo de cada línea, utilizando dos puntos como delimitador de campo (el delimitador predeterminado es tab): cut -d':' -f5

  • Recorte los campos segundo y décimo de cada línea, utilizando un punto y coma como delimitador: cut -d';' -f2,10

  • Recorte los campos 3 a 7 de cada línea, usando un espacio como delimitador: cut -d' ' -f3-7

GEOKING
fuente
0

Sé que llego tarde a la fiesta, pero esto es mucho más fácil de recordar:

cat ~/.bash_history
Mike Slinn
fuente
Es cierto, pero la segunda línea de OP: "El punto aquí es usar el comando de historial, así que por favor no responda cat ~ / .bash_history"
Cireo