我被这个活动困住了,我有一个如下所示的 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
行包含您需要的所有信息。如果该字符串可能出现在其他地方,您需要相应地调整脚本- 以下
s
ubstitute 命令包含一个复杂的正则表达式,该表达式应该识别要从该行中提取的正确部分:.*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