Bash

如何通過變數在 bash 腳本中使用 date 命令

  • October 17, 2019

我有一個包含特定日期的文件,我想將它們轉換為 UTC 格式。所以我準備了一個小腳本

我收到以下錯誤:

date: option requires an argument -- 'd'
Try `date --help' for more information.
date: extra operand `16:16:53'

我的文件內容如下:

20191014161653042nmd
20191014161653052egc
20191004081901490egc
20191004081901493nex
20191004081901497nex
20191004081902531nex
20191004081902534ksd

我的程式碼如下所示:

for i in $(cut -f1 Firstfile)
do
echo "$i" > tmpfile
TIME=$(awk '{print substr($1,1,14)}' tmpfile | sed -re 's/^([0-9]{8})([0-9]{2})([0-9]{2})([0-9]{2})$/\1\\ \2:\3:\4/' | xargs date +@%s -d | xargs date -u +"%Y-%m-%dT%H:%M:%S" -d)
MSec=$(awk '{print substr($1,15,3)}' tmpfile)
Msg=$(awk '{print substr($1,18,3)}' tmpfile)
echo -e "$TIME.$MSec $Msg" >> ResultFile
done

當我單獨使用該命令時,它工作正常,我得到了想要的結果。

awk '{print substr($1,1,14)}' tmpfile | sed -re 's/^([0-9]{8})([0-9]{2})([0-9]{2})([0-9]{2})$/\1\\ \2:\3:\4/' | xargs date +@%s -d | xargs date -u +"%Y-%m-%dT%H:%M:%S" -d

我在這個腳本中犯了什麼錯誤?為什麼當我通過 for 循環中的腳本傳遞它時它不起作用?

預期結果:

2019-10-14T20:16:52.042 nmd
2019-10-14T20:16:52.052 egc
2019-10-04T12:19:01.490 egc

等等

您的問題是您傳遞了太多數據來date使用xargs. 此外,您不會在末尾傳遞額外的文本字元串以使其成為輸出的一部分。

最好在awk腳本中完成整個操作。GNUawkmawk都具有進行基本時間戳操作的功能:

{
       YYYY    = substr($1, 1, 4)   # year
       mm      = substr($1, 5, 2)   # month
       dd      = substr($1, 7, 2)   # day
       HH      = substr($1, 9, 2)   # hour
       MM      = substr($1, 11, 2)  # minute
       SS      = substr($1, 13, 2)  # seconds
       sss     = substr($1, 15, 3)  # fractional seconds

       text    = substr($1, 18)     # the rest

       tm = mktime(sprintf("%s %s %s %s %s %s", YYYY, mm, dd, HH, MM, SS))
       printf("%s.%s %s\n", strftime("%Y-%m-%dT%H:%M:%S", tm, 1), sss, text)
}

這使用 .將輸入時間戳的各種組件挑選到各種變數中substr()。然後使用mktime()(假設輸入時間在本地時區)計算 Unix 時間,並使用strftime().

請注意,小數秒(sss在程式碼中)絕不是時間計算的一部分,而是按原樣從輸入傳輸到輸出。

執行它:

$ awk -f script.awk file
2019-10-14T14:16:53.042 nmd
2019-10-14T14:16:53.052 egc
2019-10-04T06:19:01.490 egc
2019-10-04T06:19:01.493 nex
2019-10-04T06:19:01.497 nex
2019-10-04T06:19:02.531 nex
2019-10-04T06:19:02.534 ksd

請參閱手冊中的文件mktime()和文件。strftime()``awk

引用自:https://unix.stackexchange.com/questions/547177