Je veux convertir Par exemple: Sortie souhaitée: Veuillez aider et fournir une explication avec votre Solution. 2019-02-16
en 16 février 15:29
en bash en utilisant awk
et printf code>.
root Feb 16 15:29
root Feb 16 15:30
john Feb 1 10:34
emmett Jan 12 09:45
[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
3 Réponses :
Vous pouvez utiliser strftime()
$ who | awk '{print $1}' | awk -F '[-]' '{ print $1, strftime ("%b %d %H:%M", systime()) }'
@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
.
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}'
Bonne utilisation d'une recherche de décalage dans le dictionnaire de chaînes d'exécution.
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 ()
.
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é.
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