Как конвертировать формат даты используя bash и printf? - PullRequest
0 голосов
/ 16 февраля 2019

Я хочу преобразовать 2019-02-16 в Feb 16 15:29 в bash, используя awk и printf.

Например:

[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

Желаемый вывод:

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

Пожалуйста, помогите и объясните свое решение.

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

С любым awk в любой оболочке в любой коробке UNIX:

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

Например:

$ 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

и, если выравнивание имеет значение, есть различные решения, включая использование printf вместо 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

или отделите вывод табуляцией вместо пробелов:

$ 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

или направьте вывод в column -t:

$ 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
0 голосов
/ 17 февраля 2019

Employ strftime(,mktime()) в gawk, используя не символьное регулярное выражение Разделитель полей (-F флаг):

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

Грубо говоря, увы, как было сказано выше, увыследуя вашему IO с синтаксисом mktime().

0 голосов
/ 17 февраля 2019

Вы можете использовать strftime()

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