如果你有GNU awk
,那么你可以尝试这样的事情 -
gawk '
NR==FNR{a[$2]=$1;next}
!($2 in a) {print $2,$1; next}
($2 in a) {
"date +%s -d " $1 | getline var1;
"date +%s -d " a[$2] | getline var2;
var3 = var2 - var1;
if (var3 > 4) print $2, $1, a[$2]
}' output.log input.log
测试:
[jaypal:~/Temp] cat input.log
2012-01-16T09:00:00 9
2012-01-16T10:00:00 10
2012-01-16T11:00:00 11
[jaypal:~/Temp] cat output.log
2012-01-16T10:00:04 10
2012-01-16T11:00:10 11
2012-01-16T12:00:00 12
[jaypal:~/Temp] gawk '
NR==FNR{a[$2]=$1;next}
!($2 in a) {print $2,$1; next}
($2 in a) {"date +%s -d " $1 | getline var1; "date +%s -d " a[$2] | getline var2;var3=var2-var1;if (var3>4) print $2,$1,a[$2] }' output.log input.log
9 2012-01-16T09:00:00
11 2012-01-16T11:00:00 2012-01-16T11:00:10
解释:
我们首先将 output.log 文件中的第一个字段存储在以第二个字段为索引的数组中。我们next
用来防止其他pattern{action}
语句运行。使用NR==FNR
允许我们完全吞下 output.log 文件。
!($2 in a) {print $2,$1; next}
一旦 output.log 文件完成。我们从 input.log 文件开始。我们检查 input.log 文件中存在的任何第二个字段是否不存在于我们的数组中(即 output.log 文件)。如果找到我们打印它。我们继续此操作,直到我们打印出所有这些字段。
($2 in a) {"date +%s -d " $1 | getline var1; "date +%s -d " a[$2] | getline var2; var3=var2-var1; if (var3 > 4) print $2,$1,a[$2] }
在此,我们查找两个文件中都存在的字段。当我们找到这些字段时,我们需要输入我们的逻辑来计算差异。我们使用系统命令来查找日期。现在系统命令默认打印到 STDOUT,我们无法控制它们。因此,我们通过管道输出并使用awk
getline
函数捕获输出并将其存储在变量(var1 和 var2)中。一旦两个日期都存储在一个变量中,我们就会进行差异并将其存储在 var3 中,如果发现 var3 > 4,我们会以您想要的格式打印它。