使用 shell 脚本解析文本文件

使用 shell 脚本解析文本文件

我被这个活动困住了,我有一个如下所示的 txt 文件

0112 00000 34 JOB RECOVERY status poll (ORDERID 2N000, RUNNO 0001) ACCEPTED, OWNER
0112 00000 35 JOB RECOVERY status poll (ORDERID 2N000, RUNNO 0001)STARTED , APPL TYPE
0112 00000 36 JOB PROCESS Kafka(ORDERID 2N001, RUNNO 0001) ACCEPTED , OWNER
0112 00001 37 JOB PROCESS Kafka (ORDERID 2N001, RUNNO 0001) STARTED, APPL_TYPE
0112 00001 38 JOB RECOVERY  status poll(ORDERID 2N000, RUNNO 0001) ENDED OK ,ELAPSED - 0.02 SEC
0112 00003 39 JOB PROCESS (ORDERID 2N001, RUNNO 0001) ENDED OK, ELAPSED - 2.28 SEC

我需要获得每项orderid工作的经过时间值,我需要像如果orderid是 2N000,那么我应该得到经过时间 0.02 秒。对于每个orderid我需要使用 shell 脚本从文件中获取的内容都是如此。

我需要像这样的输出

orderid    jobname           ELAPSED
2N000      RECOVERY status   0.02
2NOO1      PROCESS  Kafka   2.28

答案1

sed脚本应该可以满足您的要求:

sed '/ELAPSED/!d;s/.*JOB \([^(]*\)(ORDERID \([^,]*\).*- \([0-9.]*\).*/\2 \1 \3/'

也许您需要使其适应您的实际数据,所以我解释一下它的作用:

  • /ELAPSED/!d d删除所有不!包含 ( )的行ELAPSED,因为这些ELAPSED行包含您需要的所有信息。如果该字符串可能出现在其他地方,您需要相应地调整脚本
  • 以下substitute 命令包含一个复杂的正则表达式,该表达式应该识别要从该行中提取的正确部分:
    • .*JOB匹配JOB关键字之前的所有内容。同样,如果JOB也可以出现在作业名称内,您将需要额外的条件,但我怎么知道
    • [^(]*匹配(orderid 开头之前的所有内容。该部分被 包围,\(\)因此我们可以将其放置在 的替换中\1。请注意,您将获得完整的作业名称,而不是像输出那样RECOVERY status poll遗漏!poll
    • (ORDERID与它所说的相符,所以下一部分将是 orderid
    • [^,]*匹配下一个逗号之前的所有内容。这又被\(\), so it can be referred to as\2`包围
    • .*-匹配所有内容,包括最后一个破折号和后面的空格。希望在时间过去之前吃掉所有东西
    • [0-9.]*是几个数字和点。这应该适合经过的时间并且是子字符串号\3
    • .*匹配该行的其余部分,可能仅SEC
  • 替换字符串\2 \1 \3按所需顺序粘贴三个元素,并在其之间添加空格。根据需要进行调整。
  • 如果您希望列标题位于第一行,请自行操作。

答案2

我还忽略了“使用 shell 脚本”。所以我尝试使用 awk:

BEGIN {
  # TAB between the words
  print "orderid        jobname Elapsed"
}
/ ACCEPTED/ {
   p = match($0,/^.... ..... .. ... ([A-Za-z ]*).*ORDERID (.....)/,A)
   if (p>0) {
     # print A[2]
     O[A[2]] = A[1]
   }
}
/ELAPSED/ {
   p = match($0,/ORDERID (.....).*ELAPSED - (.*) SEC$/,A)
   # TAB between the double quotes
   print A[1] " " O[A[1]] "     " A[2]
}

返回一个制表符分隔的

orderid jobname Elapsed
2N000   RECOVERY status poll    0.02
2N001   PROCESS Kafka   2.28

相关内容