Oozie日志上的模式匹配

时间:2013-05-08 10:35:04

标签: perl bash unix hadoop oozie

使用Oozie命令

oozie jobs -oozie http://localhost:11000/oozie -localtime | grep "2013-05-08" > Input.txt

Oozie log(Input.txt)

61-oozie     DProSUCCEEDED chronicles      users     2013-05-08 04:47        2013-05-08 04:53
61-oozie     DPRUNNING chronicles      users     2013-05-08 04:47        
61-oozie     DProcessSuspended chronicles      users     2013-05-08 04:42        2013-05-08 04:48
61-oozie     DKILLED chronicles      users     2013-05-08 04:07        2013-05-08 04:09

我想要一个额外的列作为“状态”,它将状态消息存储为“SUCCESS / RUNNING / KILLED / SUSPENDED / Prep”。

我们会将第二列中的“状态”消息设为<(进程名)><(状态)>。

我无法从上面的文字中猜出分隔符。因此我们可以使用AWK / cut / substring概念。

Status messages are static . Job names are dynamic.

4状态消息

  • SUCCEEDED
  • RUNNING
  • 准备
  • KILLED
  • SUSPENDED

所需输出

61-oozie     DPro chronicles      users     2013-05-08 04:47        2013-05-08 04:53    SUCCEEDED
61-oozie     DP chronicles      users     2013-05-08 04:47          -       RUNNING
61-oozie     DProcess chronicles      users     2013-05-08 04:42        2013-05-08 04:48    Suspended
61-oozie    D chronicles      users     2013-05-08 04:07        2013-05-08 04:09    KILLED

2 个答案:

答案 0 :(得分:1)

提取所需状态并将其放在行尾

perl -pe 's/\B(succeeded|running|suspended|killed|prep)//i and $w=$1 and s/$/    $w/' file

答案 1 :(得分:0)

sed 's/(\w+)(SUCCEEDED|RUNNING|Prep|KILLED|SUSPENDED)(\s+.+)$/\1\3 \2/g'

即。前状态,状态,后状态 - >前状态,后状态,状态

由于您似乎在输入状态和所需输出之间存在差异,例如'ProcessSuspended'和'SUSPENDED'输出,那么你可能还想交换它们:

sed 's/(\w+)(SUCCEEDED|RUNNING|Prep|KILLED|SUSPENDED)(\s+.+)$/\1\3 \2/g' | sed 's/ProcessSuspended$/SUSPENDED/g'

或者使用Perl进行查找。