我正在编写一个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 ...
完美无缺。当然,第一次尝试时,文本与我的变量几乎相同。
答案 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
有些问题要问:
queue_id
,f_time
,f_day
和f_month
的确切值是多少?使用例如printf '%s' "$queue_id" | hexdump -C
查看是否
来自$line
的任何隐藏字符都会让date
混淆。
您是否可以通过对代码的值进行硬编码而不仅仅是f_fulltime
本身来重现问题?
您是否可以在调用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"
一切正常..
为什么?