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 los duplicados secuenciales, de modo que con esta cadena de comandos:
ls
cd ~
ls
El ls
comando en realidad se grabará dos veces. He pensado en ejecutar periódicamente w / cron:
cat .bash_history | sort | uniq > temp.txt
mv temp.txt .bash_history
Esto lograría eliminar los duplicados, pero desafortunadamente el orden no se conservaría. Si no hago sort
el archivo primero, no creo que uniq
pueda funcionar correctamente.
¿Cómo puedo eliminar duplicados en mi .bash_history, preservando 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 debe enviar una señal de nohup / reset kill
para que vacíe su conexión con el archivo. Si ese es el caso con el .bash_history
archivo, ¿tal vez podría usarlo ps
para verificar y asegurarme de que no haya sesiones conectadas antes de ejecutar el script de filtrado?
ignoredups
lugar deerasedups
por un tiempo y vea cómo funciona para usted.history
comando. ¿Dónde debería estar mirando?Respuestas:
Ordenar la historia
Este comando funciona como
sort|uniq
, pero mantiene las líneas en su lugarBásicamente, antecede a cada línea su número. Después del
sort|uniq
encendido, todas las líneas se vuelven a clasificar 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á definida 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 elige al último representante, puede
sort
ingresar una segunda tecla:Administrar .bash_history
Para volver a leer y escribir el historial, puede usar
history -a
yhistory -w
respectivamente.fuente
sort
, el-r
interruptor siempre invierte el orden de clasificación. Pero esto no dará el resultado que tienes en mente.sort
considera que las dos ocurrenciasls
son idénticas al resultado de que, incluso cuando se invierte, el orden eventual depende del algoritmo de clasificación. Pero mira mi actualización para otra idea.nl
al principio de cada línea de código? ¿No debería serhistory
?Así que estaba buscando exactamente lo mismo después de estar molesto por los duplicados, y descubrí que si editaba mi ~ / .bash_profile (Mac) con:
Hace exactamente lo que quería, solo mantiene lo último de cualquier comando.
ignoreboth
en realidad es como hacerignorespace:ignoredups
y eso junto con hacererasedups
el trabajo.Al menos en mi terminal Mac con bash, este trabajo es perfecto. Lo encontré aquí en askubuntu.com .
fuente
Encontré esta solución en la naturaleza y probé:
La primera vez que se ve un valor específico de una línea ($ 0), el valor de x [$ 0] es cero.
El valor de cero se invierte
!
y se convierte en uno.Una declaración que se evalúa como uno provoca la acción predeterminada, que es imprimir.
Por lo tanto, la primera vez que
$0
se ve un específico , se imprime.La próxima vez (las repeticiones) el valor de
x[$0]
se ha incrementado,su valor negado es cero y no se imprime una declaración que evalúe a cero.
Para mantener el último valor repetido, invierta el historial y use el mismo awk:
fuente
Extendiendo la respuesta de Clayton:
tac
invierta el archivo, asegúrese de haberlo instaladomoreutils
para tenerlosponge
disponible; de lo contrario, use un archivo temporal.fuente
brew install coreutils
y tenga en cuenta que todas las utilidades de GNU tienen ung
antecedente para evitar confusiones con los comandos integrados de BSD para Mac (por ejemplo, gsed es GNU mientras sed es BSD). Así que usagtac
.Estos mantendrían las últimas líneas duplicadas:
fuente
Esta es una publicación antigua, pero un problema perpetuo para los usuarios que desean tener múltiples terminales abiertas y tener el historial sincronizado entre ventanas, pero no duplicado.
Mi solución en .bashrc:
history -n
lee todas las líneas de $ HISTFILE que pueden haber ocurrido en un terminal diferente desde el último retorno de carrohistory -w
escribe el búfer actualizado en $ HISTFILEhistory -c
limpia el búfer para que no se produzca duplicaciónhistory -r
vuelve a leer el $ HISTFILE, agregando al búfer ahora en blancotac
lo revierte y luego lo revierte para que se pueda guardar con los comandos más recientes aún más recientes en el historialCada vez que abre un nuevo shell, el historial borra todos los duplicados, y cada vez que presiona la Entertecla en una ventana de shell / terminal diferente, actualiza este historial del archivo.
fuente
Grabar unívocamente cada nuevo comando es complicado. Primero necesita agregar
~/.profile
o similar:Entonces necesitas agregar a
~/.bash_logout
:fuente