如果输入和logdata格式不同,如何从logfile获取数据?

时间:2016-07-07 09:16:57

标签: unix awk sed

我的日志文件数据是

[10/04/16 02:07:20 BST] Data 1
[11/04/16 02:07:20 BST] Data 1
[10/05/16 04:11:09 BST] Data 2
[12/05/16 04:11:09 BST] Data 2
[11/06/16 06:22:35 BST] Data 3

我的输入格式是

./filename Apr 11 16 00:00:00 Jul 10 16 00:00:00

我正在使用以下函数将输入格式转换为日志文件格式

convert_date () {
local months=( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec )
local i

for (( i=0; i<11; i++ )); do
    [[ $1 = ${months[$i]} ]] && break
done
printf "\[%2d\/%02d\/%02d $4 BST\]\n" $2 $(( i+1 )) $3 

for (( i=0; i<11; i++ )); do
    [[ $5 = ${months[$i]} ]] && break
done    
}

我还将结果存储在变量中并使用它

Start=$( convert_date $1 $2 $3 $4 )
End=$( convert_date $5 $6 $7 $8 )

但是只有在日志文件中存在Stattime和endtime时,代码才会给出结果。即使日志文件中不存在开始时间和结束时间,如何在两次之间获取数据。我可以使用什么awk脚本?

2 个答案:

答案 0 :(得分:0)

您的Bash(假设)功能似乎按以下格式输出日期:

$ bash test.sh "Apr 11 16 00:00:00"
\[11\/04\/16 00:00:00 BST\]

使用它,test.awk:

BEGIN {
    FS="[[/: ]+"; # set field separator to all delimiters in datetime format in the date                                                    
    split(start,arr,"[\\\\[/ :]") # split the start variable in pieces for reorganize 
    start=arr[4]" "arr[3]" "arr[2]" "arr[5]" "arr[6]" "arr[7] # reorganize
}
start <= $4" "$3" "$2" "$5" "$6" "$7 # compare reorganized data to date in start variable

$ awk -v start="\[11\/04\/16 00:00:00 BST\]" -f test.awk test.in 
[11/04/16 02:07:20 BST] Data 1
[10/05/16 04:11:09 BST] Data 2
[12/05/16 04:11:09 BST] Data 2
[11/06/16 06:22:35 BST] Data 3

虽然有点抱怨:     awk: warning: escape sequence '\[' treated as plain '['

答案 1 :(得分:0)

输入格式在&#34; Input.Format&#34;文件和日志文件位于&#34; Log.File&#34;。这个shell脚本&#39; cat&#39;文件和管道都是“awk”#。 awk脚本将月份格式更改为编号,与日志文件进行比较以打开或关闭打印开关。

compute.v1.instanceTemplate