GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo eliminar duplicados en .bash_history, conservando el orden?

Realmente disfruto usando control+r para buscar recursivamente mi historial de comandos. He encontrado algunas buenas opciones que me gusta usar con él:

# ignore duplicate commands, ignore commands starting with a space
export HISTCONTROL=erasedups:ignorespace

# keep the last 5000 entries
export HISTSIZE=5000

# append to the history instead of overwriting (good for multiple connections)
shopt -s histappend

El único problema para mí es que erasedups solo borra duplicados secuenciales, de modo que con esta cadena de comandos:

ls
cd ~
ls

Los ls el comando en realidad se grabará dos veces. He pensado en ejecutar periódicamente con cron:

cat .bash_history | sort | uniq > temp.txt
mv temp.txt .bash_history

Esto lograría eliminar los duplicados, pero lamentablemente no se conservaría el orden. Si no sort el archivo primero no creo uniq puede funcionar correctamente.

¿Cómo puedo eliminar duplicados en mi .bash_history, conservando el orden?

Crédito adicional:

¿Hay algún problema al sobrescribir el .bash_history? archivo a través de un script? Por ejemplo, si elimina un archivo de registro de apache, creo que necesita enviar una señal nohup/reset con kill para que vacíe su conexión con el archivo. Si ese es el caso con .bash_history archivo, tal vez de alguna manera podría usar ps para verificar y asegurarse de que no haya sesiones conectadas antes de ejecutar el script de filtrado?

Respuesta aceptada:

Ordenar el historial

Este comando funciona como sort|uniq , pero mantiene las líneas en su lugar

nl|sort -k 2|uniq -f 1|sort -n|cut -f 2

Básicamente, antepone a cada línea su número. Después de sort|uniq -ing, todas las líneas se ordenan de nuevo según su orden original (utilizando el campo de número de línea) y el campo de número de línea se elimina de las líneas.

Esta solución tiene el defecto de que no está definido qué representante de una clase de líneas iguales lo hará en la salida y, por lo tanto, su posición en la salida final no está definida. Sin embargo, si se debe elegir el último representante, puede sort la entrada por una segunda tecla:

nl|sort -k2 -k 1,1nr|uniq -f1|sort -n|cut -f2

Gestionar .bash_history

Para volver a leer y escribir el historial, puede usar history -a y history -w respectivamente.

Relacionado:¿Ejecutar scripts bash al ingresar a un directorio?
Linux
  1. Cómo usar el comando de historial en Linux

  2. Cómo eliminar un usuario en Linux usando la línea de comandos

  3. ¿Cómo eliminar una sola línea del historial?

  4. Cómo quitar la contraseña de su clave SSL

  5. Cómo quitar el administrador de caché de cPanel

Cómo eliminar duplicados en LibreOffice

Cómo quitar los accesos directos en Google Chrome

Cómo borrar el historial en Google Chrome

Cómo usar el comando de historial en CentOS 8

Cómo quitar un comando del historial en Linux

Cómo usar el "historial de Yum" para averiguar paquetes instalados o eliminados