eliminar comandos duplicados en el historial de Linux

Eliminar comandos duplicados en el historial de Linux

Como puedo eliminar comandos duplicados en el historial de mi .bash_history?

Todo el contenido de lo que escribimos en la linea de comando de cualquier Linux (Debian, Ubuntu, Mint o MXLinux) queda guardado en el archivo de historico llamado .bash_history. Si quieren completamente borrar el historial Linux, ese es el archivo a eliminar.

En algun momento y con el pasar del tiempo, este archivo crece demasiado y al final la gran mayoria de los comandos estas duplicados varias veces. La idea es eliminar comandos linux, y asi borrar el historial de Ubuntu, o Debian, Mint o MX Linux.

Como puedo ver los comandos duplicados en el historial de Linux

:~$ history

El comando anterior despliega un listado con numero de fila de todo lo que se ha guardado en el historico, incluyendo el mismo.

Lo que necesitamos hacer para eliminar comandos duplicados en el historial, del archivo el .bash_history,

  1. Ignorar los comandos duplicados y no los comandos que empiezan con espacios
  2. Mantenga un maximo de 1000 a 5000 lineas
  3. Pueda agregar los comandos sin reemplazar
  4. Los comandos no tienen que estar en secuencia para buscar y eliminar
  5. Es bueno si puede conservar el orden original
  6. El historial de linux debe permanecer en sincronia entre ventanas, pero eliminar los comandos duplicados

La solucion para eliminar comandos duplicados en el historial

Para que funcione automaticamente, es necesario que el script se ejecute cada vez que se abra una nueva sesion. Ya sea local o remotamente via ssh (o cualquier otro protocolo de acceso remoto).

La solucion utiliza el archivo .bashrc, al final de dicho archivo agregamos;

shopt -s histappend
export HISTCONTROL=ignoreboth:erasedups
export PROMPT_COMMAND="history -n; history -w; history -c; history -r"
tac "$HISTFILE" | awk '!x[$0]++' > /tmp/tmpfile  &&
                tac /tmp/tmpfile > "$HISTFILE"
rm /tmp/tmpfile

Ahora les explico que hace cada linea del script.

  1. histappend agrega el historial que contiene el buffer al final del archivo historico llamado ($HISTFILE)
  2. ignoreboth y erasedups previene que las entradas duplicadas sean grabadas en el archivo temporal $HISTFILE
  3. El prompt_command actualiza el cache del historico;
    1. history -n lee todas las lineas almacenadas en $HISTFILE que se pueden haber agregado en otra terminal desde la ultima vez que ingresamos un comando
    2. history -w escribe el buffer actualizado a $HISTFILE
    3. history -c elimina el buffer, asi no tendremos duplicados que guardar
    4. history -r vuelve a leer el archivo $HISTFILE, y agrega al ahora buffer en blanco
  4. Utilizamos el comando awk en el script para guardar la primera ocurrencia de cada linea que encuentra. Tac lo revierte y luego de regreso para que pueda guardarse los comandos más recientes en el historial
  5. Al final borramos el archivo temporal

Cada vez que abrimos un nuevo shell, todos los duplicados del historico se borran. Y cada vez que ingresamos un comando en una nueva ventana/terminal/shell, actualiza el historico desde el archivo. Linux viene cargado de una infinidad de herramientas y comandos GNU con los que se puede programar y automatizar muchas tareas de un administrador de sistemas.

Via | remove duplicates

Deja tus preguntas o comentario