如何计算awk中args的时差

时间:2016-02-25 08:43:18

标签: bash shell awk

我输入的格式如下

addSbtPlugin("com.beachape" % "sbt-myplugin" % "1.1")

使用awk我试图使用以下命令打印位于7,12,16列中的所需列,如下所示

0001580-160219044548744-oozie-oozi-W@:start:    -       -       -       -       OK      :start: 0       -       :START: 2016-02-24 13:34:46 GMT OK      2016-02-24 13:34:46 GMT
0001580-160219044548744-oozie-oozi-W@PrepareHDFS        -       -       -       -       OK      PrepareHDFS     0       -       fs      2016-02-24 13:34:46 GMT OK  2016-02-24 13:34:47 GMT

,输出

cat input |  awk '/^000/ {printf "%-40s %-10s %-10s",$7,$12,$16}'

我的要求是以上输出我也需要时差。 我在脚本中尝试了一个

:start:                                  05:35:56   05:35:56
PrepareHDFS                              05:35:56   05:35:57

但我收到的错误是语法无效。如何实现时差,以便输出

cat intput | awk '/^000/ {printf "%-40s %-10s %-10s",$7,$12,$16; 
T1=`date +%s -d $12`;T2=`date +%s -d $16`;
DIFF=`expr ${SEC2} - ${SEC1}`; print `date +%H:%M:%S -ud ${DIFF}` }'

编辑:

对于时差,我有以下脚本

PrepareHDFS                              05:35:56   05:35:57  00:00:01
ScheduleStart                            05:35:57   05:36:11  00:00:14

我可以在函数中使用这组行,并从awk调用该函数吗?

1 个答案:

答案 0 :(得分:2)

你可以使用awk来做,这只是一点点...... unweildy:

awk -v cmd='date +%s -d ' -v cmd2='date +%H:%M:%S -d ' '/^000/ {
  cmd $12 | getline T1; close(cmd $12); 
  cmd $16 | getline T2; close(cmd $16); 
  cmd2 (T2 - T1) | getline T1; close(cmd2 (T2 - T1)); 
  printf "%-40s %-10s %-10s%-10s\n", $7, $12, $16, T1
}'

您无法在awk中使用shell的反引号过程替换。 awk有自己的方法来获取命令的输出 - 通过getline and coprocesses。语法大致是:

command | getline var-name
close(command)

其中command是包含命令的变量或字符串。 cmd $12只是cmd$12的串联,因此该命令将变为date +%s -d 13:34:46,例如。

date对纯数字的解释是复杂的。最好强制它使用前导@将输入数字看作Unix时间戳:

awk -v cmd='date +%s -d ' -v cmd2='date +%H:%M:%S -d @' '/^000/ {
  cmd $12 | getline T1; close(cmd $12); 
  cmd $16 | getline T2; close(cmd $16); 
  cmd2 (T2 - T1) | getline T3; close(cmd2 (T2 - T1)); 
  printf "%-40s %-10s %-10s%-10s\n", $7, $12, $16, T3
}'