date:在bash上OSX 10上的非法时间格式,但命令有效

时间:2016-03-09 08:13:59

标签: macos bash date format

我正在编写一个bash脚本,用于读取和解析日志行中的数据,并且它正在尝试转换格式。脚本很长,但我会关注错误:

if [[ $line == *"Marked: Malicious, To:"* ]]; then

QUEUE_ID=`awk ' {print $13}'  <<< $line | sed 's/,//g'` # QUEUE ID... index of the array

F_TIME["X$QUEUE_ID"]=`awk '{print $3}'  <<< $line ` # Hour
F_DAY["X$QUEUE_ID"]=`awk '{print $2}'  <<< $line ` # Day
F_MONTH["X$QUEUE_ID"]=`awk '{print $1}'  <<< $line ` # Month

#Procesing and obtaining the diff

F_FULLTIME["X$QUEUE_ID"]="${F_DAY["X$QUEUE_ID"]}-${F_MONTH["X$QUEUE_ID"]}-$year-${F_TIME["X$QUEUE_ID"]}" # creating the time in desired format

s=`date -j -f "%d-%b-%Y-%H:%M:%S"  "${F_FULLTIME[X$QUEUE_ID]}"   +%s` # ERROR LINE!! Doesn't work!

#s=`date -j -f "%d-%b-%Y-%H:%M:%S"  "2-Mar-2016-22:24:33"   +%s` # Test line

echo ".....${F_FULLTIME["X$QUEUE_ID"]}....2-Mar-2016-22:24:33...."

echo  "time $s ...\n";

fi

测试过程:我评论测试行(在脚本上标记),并尝试转换为变量s。这是每个键的输出:

Failed conversion of ``2-Mar-2016-20:30:03'' using format ``%d-%b-%Y-%H:%M:%S''
date: illegal time format
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
        [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

.....2-Mar-2016-20:30:03....2-Mar-2016-22:24:33....

日期不采用格式。正如您所看到的,期望的格式和我对变量的格式几乎相同。

测试#2:我评论错误行,并删除评论测试行。这是结果:

.....2-Mar-2016-22:06:10....2-Mar-2016-22:24:33....
time 1456953873 ...

完美无缺。当然,第一次尝试时,文本与我的变量几乎相同。

2 个答案:

答案 0 :(得分:0)

代码看起来还不错,虽然过于复杂。试试这个简化版本,这应该更容易调试。我们将尽可能多地处理单个变量,而不是数组条目。

if [[ $line == *"Marked: Malicious, To:"* ]]; then

    # run `awk` once
    fields=$(awk '{print $1, $2, $3, $13}' <<< "$line")
    read f_month f_day f_time queue_id <<< "$fields"
    queue_id=${queue_id//,/}

    # Is the X really necessary?

    # F_TIME["X$queue_id"]=$f_time
    # F_DAY["X$queue_id"]=$f_day
    # F_MONTH["X$queue_id"]=$f_month

    #Procesing and obtaining the diff
    f_fulltime="$f_day-$f-month-$year-$f_time"
    # F_FULLTIME["X$queue_id"]=$f_fulltime

    s=$(date -j -f "%d-%b-%Y-%H:%M:%S" "$f_fulltime" )    
fi

有些问题要问:

  1. queue_idf_timef_dayf_month的确切值是多少?使用例如printf '%s' "$queue_id" | hexdump -C查看是否 来自$line的任何隐藏字符都会让date混淆。

  2. 您是否可以通过对代码的值进行硬编码而不仅仅是f_fulltime本身来重现问题?

  3. 您是否可以在调用line之前对awk的值进行硬编码来重现问题?

答案 1 :(得分:0)

嗯..我已经清理了脚本..,删除了额外的变量,声明了数组,我找到了错误的地方..但不知道为什么。该变量出现在变量$ year。

这被定义为:

year=`date +"%Y"`

然后..当我尝试这种转换时:

s_fulltime["X$queue_id"]="$day-$month-$year-$time" >> date: illegal time format

但是..如果我要编码&#34; 2016&#34;然后..

year="2016"

一切正常..

为什么?