2
votes

Comment convertir le format de date en utilisant bash et printf?

Je veux convertir 2019-02-16 en 16 février 15:29 en bash en utilisant awk et printf code>.

Par exemple:

root Feb 16 15:29
root Feb 16 15:30
john Feb 1  10:34
emmett Jan 12 09:45

Sortie souhaitée:

[root@localhost ~]# who | awk '{print $1, $3, $4}'
root 2019-02-16 15:29
root 2019-02-16 15:30
john 2019-02-01 10:34
emmett 2019-01-12 09:45

Veuillez aider et fournir une explication avec votre Solution.


2 commentaires

Si personne ne propose une solution élégante, vous pourriez créer quelque chose de laid à partir de date --date = $ (who | awk '{print $ 3, $ 4}')


idownvotedbecau.se/beingunresponsive


3 Réponses :


1
votes

Vous pouvez utiliser strftime()

$ who | awk '{print $1}' | awk -F '[-]' '{ print $1, strftime ("%b %d %H:%M", systime()) }'


6 commentaires

@CharlesDuffy Je pense que oui. Le premier est nécessaire pour obtenir uniquement l'utilisateur, tout en éliminant les autres.


Vous devez mentionner que nécessite GNU awk pour les fonctions de temps. De plus, systime () vous indiquera l'heure actuelle sur votre système - vous devez utiliser mktime () à la place pour convertir l'heure de l'entrée en secondes depuis l'époque. Il y a aussi quelques erreurs de syntaxe avec des accolades au mauvais endroit et des parenthèses manquantes. Et enfin - évidemment, cela ne peut pas produire la sortie multi-champs attendue étant donné que cela ne fonctionne que sur 1 des champs d'entrée.


@EdMorton merci, en particulier pour les premières parenthèses manquantes que j'ai oublié de mettre juste après strftime et la première accolade, maintenant j'ai corrigé.


Vous êtes les bienvenus. Je vais toujours imprimer l'heure à laquelle l'outil est exécuté plutôt que l'heure du fichier d'entrée.


@EdMorton sur mon écran, $ date -> Dim 17 février 18:42:23 +03 2019 , $ who -> oracle tty1 2019-02-17 00:03 (: 0) , $ uname -r -> 4.1.12.103.9.7.el6uek.x86_64 et le résultat de la commande ci-dessus est oracle 17 février 18:42


Exact parce que systime (() renvoie les secondes depuis l'époque pour le moment où systime () est exécuté. Ce n'est pas ce que veut l'OP - elle veut l'heure de la sortie de qui reformaté donc sa sortie souhaitée pour l'exemple dans votre commentaire serait oracle 17 février 00:03 .



3
votes

Avec n'importe quel awk dans n'importe quel shell sur n'importe quelle boîte UNIX:

$ awk '{split($2,d,/-/); print $1, substr("JanFebMarAprMayJunJulAugSepOctNovDec",(d[2]*3)-2,3), d[3]+0, $3}' file | column -t
root    Feb  16  15:29
root    Feb  16  15:30
john    Feb  1   10:34
emmett  Jan  12  09:45

Par exemple:

$ awk -v OFS='\t' '{split($2,d,/-/); print $1, substr("JanFebMarAprMayJunJulAugSepOctNovDec",(d[2]*3)-2,3), d[3]+0, $3}' file
root    Feb     16      15:29
root    Feb     16      15:30
john    Feb     1       10:34
emmett  Jan     12      09:45

et si l'alignement est important, il existe différentes solutions , y compris en utilisant printf au lieu de print:

$ awk -v OFS='\t' '{split($2,d,/-/); printf "%s %s %-2d %s\n", $1, substr("JanFebMarAprMayJunJulAugSepOctNovDec",(d[2]*3)-2,3), d[3]+0, $3}' file
root Feb 16 15:29
root Feb 16 15:30
john Feb 1  10:34
emmett Jan 12 09:45

ou séparez la sortie avec des tabulations au lieu de blancs:

$ cat file
root 2019-02-16 15:29
root 2019-02-16 15:30
john 2019-02-01 10:34
emmett 2019-01-12 09:45

$ awk '{split($2,d,/-/); print $1, substr("JanFebMarAprMayJunJulAugSepOctNovDec",(d[2]*3)-2,3), d[3]+0, $3}' file
root Feb 16 15:29
root Feb 16 15:30
john Feb 1 10:34
emmett Jan 12 09:45

ou pipe la sortie vers la colonne -t :

$ who | awk '{split($3,d,/-/); print $1, substr("JanFebMarAprMayJunJulAugSepOctNovDec",(d[2]*3)-2,3), d[3]+0, $4}'


1 commentaires

Bonne utilisation d'une recherche de décalage dans le dictionnaire de chaînes d'exécution.



1
votes

Employez strftime (, mktime ()) dans gawk , en utilisant une expression régulière sans caractère Séparateur de champs ( -F flag):

your_output |gawk -F'\\W' '
    {print $1 , strftime("%b %d %H:%M",mktime($2 " " $3 " " $4 " " $5 " " $6 " 00"))}
'

À peu près ce qui a été dit ci-dessus, hélas suivant avec votre IO avec la syntaxe mktime () .


4 commentaires

pourquoi la partie secondes est par défaut 00


@ stack0114106 ils ne doivent pas être définis par défaut, juste ils n'étaient pas présents dans les données de l'OP, et sont obligatoires dans la liste d'arguments de mktime () .


sry..J'obtiens la sortie en tant que root 16 février 15:00 et non 16 février 15:29


@ stack0114106 WOOPS! La fin du format de date doit être % H:% M et non % H:% S , ce qui impliquerait clairement des secondes ... édité. À votre santé.