18 votes

Impossible de lire l'horodatage de l'historique Zsh

Problème : pour comprendre l'horodatage suivant

1241036430

à ~/.history

: 1241036336:0;vim ~/.zshrc
: 1241036379:0;vim ~/bin/HideTopBar
: 1241036421:0;ls
: 1241036430:0;cat ~/.history

lorsque j'ai

setopt EXTENDED_HISTORY
HISTFILE=~/.history

dans le fichier .zshrc.

Comment lire l'horodatage ?

21voto

Nicholas Riley Points 26161

Pruebe history -d . Ou tapez simplement history - et appuyez sur Ctrl-D pour obtenir toutes les options possibles :

% history -
-D  -- print elapsed times
-E  -- dd.mm.yyyy format time-stamps
-d  -- print time-stamps
-f  -- mm/dd/yyyy format time-stamps
-i  -- yyyy-mm-dd format time-stamps
-m  -- treat first argument as a pattern
-n  -- suppress line numbers
-r  -- reverse order of the commands

12voto

Siosm Points 63

Vous pouvez afficher l'ensemble de l'historique avec des horodatages lisibles par l'homme à l'aide de cette ligne de conduite tirée de une réponse sur la liste de diffusion zsh :

perl -lne 'm#: (\d+):\d+;(.+)# && printf "%s :: %s\n",scalar localtime $1,$2' $HISTFILE

Je recommanderais d'acheminer la sortie vers un pager ( less par exemple) pour le rendre plus lisible.

3voto

olejorgenb Points 21

Ce simple util appelé localtime est idéal pour lire les fichiers contenant des horodatages :

#!/usr/bin/perl
# http://perl.plover.com/classes/mybin/samples/source/localtime

if ($ARGV[0] eq '-f') {
  *show_localtime = \&show_localtime_list;
  shift;
}

if (@ARGV) {
  for (@ARGV) {
    print show_localtime($_), "\n";
  }
} else {
  while (<>) {
    s/^(\d+)/show_localtime($1)/e;
    print;
  }
}

sub show_localtime {
  my $t = shift;
  scalar localtime $t;
}

sub show_localtime_list {
  my $t = shift;
  my @a = localtime $t;
  "@a\n"
}

Il gère de nombreux cas, et semble comprendre les horodatages en secondes et mini-secondes, etc.

$ localtime < ~/.histfile
<snip>
: Sat Sep 17 05:55:17 2016:0;cat localtime

3voto

Dr Beco Points 1668

Conversion d'horodatages avec awk

Si vous voulez lire le fichier lui-même, pour l'utiliser avec, disons, grep ou tout autre filtre, vous devez convertir les horodatages.

J'ai créé ce script, que j'ai sauvegardé dans mon /usr/local/bin et cela fonctionne pour bash y zshell :

script uhistory.awk at /usr/local/bin/uhistory.awk

#!/usr/bin/awk -f
{ 
        if (match($0,/^#/)) # bash
        {
                nlin++
                #adata="@"substr($0,2) 
                #printf("%s ", adata)
                cmdata = "date -d \"@" substr($0,2) "\" +\"%F %H:%M:%S\"" 
                cmdata | getline datado
                close(cmdata)
                printf("%d %s ", nlin, datado)
        }
        else
        if (match($0,/^:/)) # zshell
        {
            nlin++
            split($0, arr, ":|;")
            cmdata = "date -d \"@" substr(arr[2],2) "\" +\"%F %H:%M:%S\"" 
            cmdata | getline datado
            close(cmdata)
            printf("%d : %s ; %ss % ", nlin, datado, arr[3])
            for (i in arr)
            {
                if (i < 4)
                    continue
                printf("%s ", arr[i])
            }
            printf("\n")
        }
        else
        {
            print $0
        }
}

Utilisation Le fichier d'historique est un fichier de base : il est possible de faire passer l'historique par le filtre. Supposons que le fichier historique de zsh qui a le format :

:timestamp:duration;commands

Sans la uhistory.awk serait le filtre :

% head ~/.config/zsh/zhistfile

: 1570482839:0;la
: 1570482839:0;cd zsh
: 1570482839:0;ls
: 1570482839:1;cat verybigaliasfile.txt
: 1570482839:0;alias
: 1570482839:0;ls -la
: 1570482839:0;vi .zshrc
: 1570482839:0;alias

Avec la uhistory.awk il apparaîtrait comme suit :

% head ~/.config/zsh/zhistfile | uhistory.awk | grep alias

4 : 2019-10-07 18:13:59 ; 1s % cat verybigaliasfile.txt
5 : 2019-10-07 18:13:59 ; 0s % alias 
9 : 2019-10-07 18:13:59 ; 0s % alias 

Mais si votre utilisation n'implique pas de traiter le fichier lui-même, vous n'avez besoin que d'un alias.

Ajoutez cette ligne à votre .zsh_aliases ou tout autre endroit que vous avez prévu pour vos alias.

alias history='fc -il 1'

ou une autre option de fc commande. Vérifier avec man zshbuiltins


L'idéal est d'utiliser la même commande, afin d'éviter toute confusion au cas où vous souhaiteriez ajouter une autre touche/option à la fin. Dans ce cas, je recommande :

alias history='history -i'

Et bien sûr, vous pouvez simplement envoyer le résultat à l'aide d'un tuyau, par exemple :

% history | grep alias

4   2019-10-07 18:13:59  cat verybigaliasfile.txt
5   2019-10-07 18:13:59  alias 
9   2019-10-07 18:13:59  alias 

En l'occurrence, durée n'apparaîtra pas, mais le reste est identique.

2voto

Tatjana Heuser Points 249

Additif : Vous pouvez utiliser le history elle-même pour traduire également les horodatages trouvés dans les fichiers d'historique sauvegardés :

Les options de la history telle qu'expliquée par Nicholas Riley s'applique tout aussi bien aux fichiers historiques sauvegardés, donc history -d < historyfile (ou toute autre option) traduit parfaitement les horodatages.

Cela s'avère utile si vous utilisez plus d'un fichier d'historique - j'ai configuré zsh de conserver un fichier d'historique par pty pour éviter de mélanger les historiques des shells fonctionnant en parallèle sur le même système (puisque généralement chaque fenêtre/écran/... est particulier à une certaine tâche, et donc les historiques émergeant d'une utilisation normale finissent en quelque sorte par se ressembler).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X