convertir les horodatages des balises de hachage dans le fichier historique en chaîne souhaitée

quand je stocke la sortie de la commande d’historique via ssh dans un fichier, je reçois quelque chose comme ça

ssh -i private_key user@ip 'export HISTFILE=~/.bash_history; export HISTTIMEFORMAT="%D-%T "; set -o history; history' > myfile.txt 

SORTIE

 #1337431451 command 

autant que possible, cette chaîne de hachage représente un horodatage. comment puis-je changer cela en une chaîne de mon format souhaité

L’historique d’utilisation de PS dans ssh ne génère pas d’horodatage. J’ai essayé presque tout. Donc, je pense que la meilleure chose à faire serait de convertir ces horodatages # à un format de date et heure lisible. Comment puis-je m’y prendre?

Question intéressante: je l’ai essayé mais je n’ai trouvé aucune solution simple et propre pour accéder à l’historique dans un shell non interactif. Cependant, le format du fichier d’historique est simple et vous pouvez écrire un script pour l’parsingr. Le script python suivant pourrait être intéressant. Appelez-le avec ssh -i private_key user@ip 'path/to/script.py .bash_history' :

 #! /usr/bin/env python3 import re import sys import time if __name__ == '__main__': pattern = re.comstack(br'^#(\d+)$') out = sys.stdout.buffer for pathname in sys.argv[1:]: with open(pathname, 'rb') as f: for line in f: timestamp = 0 while line.startswith(b'#'): match = pattern.match(line) if match: timestamp, = map(int, match.groups()) line = next(f) out.write(time.strftime('%F %T ', time.localtime(timestamp)).encode('ascii')) out.write(line) 

vous pouvez combiner des lignes avec la commande paste:

 paste -sd '#\n' .bash_history 

et convertir la date avec strftime dans awk:

 echo 1461136015 | awk '{print strftime("%d/%m/%y %T",$1)}' 

par conséquent, l’historique de bash avec timestamp peut être analysé par la commande suivante:

 paste -sd '#\n' .bash_history | awk -F"#" '{d=$2 ; $2="";print NR" "strftime("%d/%m/%y %T",d)" "$0}' 

qui convertit:

 #1461137765 echo lala #1461137767 echo bebe 

à

 1 20/04/16 10:36:05 echo lala 2 20/04/16 10:36:07 echo bebe 

vous pouvez également créer un script comme / usr / local / bin / fhistory avec un contenu:

 #!/bin/bash paste -sd '#\n' $1 | awk -F"#" '{d=$2 ; $2="";print NR" "strftime("%d/%m/%y %T",d)" "$0}' 

et parsingr rapidement le fichier historique bash avec la commande suivante:

 fhistory .bash_history 

En utilisant simplement Awk et d’une manière légèrement plus précise:

 awk -F\# '/^#1[0-9]{9}$/ { if(cmd) printf "%5d %s %s\n",n,ts,cmd; ts=strftime("%F %T",$2); cmd=""; n++ } !/^#1[0-9]{9}$/ { if(cmd)cmd=cmd " " $0; else cmd=$0 }' .bash_history 

Ceci parsing uniquement les lignes commençant par quelque chose qui ressemble à un horodatage ( /^#1[0-9]{9}$/ ), comstack toutes les lignes suivantes jusqu’au prochain horodatage, combine les commandes multi-lignes avec " " (1 espace ) et imprime les commandes dans un format similaire à l’ history y compris une numérotation.

Notez que la numérotation ne correspond pas (nécessairement) s’il y a des commandes multi-lignes.

Sans la numérotation et la séparation des commandes multilignes avec une nouvelle ligne:

 awk -F\# '/^#1[0-9]{9}$/ { if(cmd) printf "%s %s\n",ts,cmd; ts=strftime("%F %T",$2); cmd="" } !/^#1[0-9]{9}$/ { if(cmd)cmd=cmd "\n" $0; else cmd=$0 }' .bash_history 

Enfin, une solution rapide et sale utilisant GNU Awk (gawk) pour sortinger également la liste:

 gawk -F\# -v histtimeformat="$HISTTIMEFORMAT" ' /^#1[0-9]{9}$/ { i=$2 FS NR; cmd[i]="" } !/^#1[0-9]{9}$/ { if(cmd[i]) cmd[i]=cmd[i] "\n" $0; else cmd[i]=$0 } END { PROCINFO["sorted_in"] = "@ind_str_asc" for (i in cmd) { split(i,arr) print strftime(histtimeformat,arr[1]) cmd[i] } }'