使用linux的文本处理



我有一个文本文件,如下所示。

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获取perated-value,如果orderid是2N000,那么我应该为我需要使用shell脚本从文件中获取的每个orderid获取-0.02秒的perated。

我需要像一样的输出

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

如果jobname、perated或orderid中有空格,也必须对其进行评估。请查找问题的父版本:使用shell脚本解析文本文件。

重要提示:sed不可用。

Bash解决方案:

#! /bin/bash
set -eu
while read line ; do
if [[ $line =~ JOB' '([^)]+)'('ORDERID' '([^,]+).*ELAPSED' '-' '([0-9.]+) ]] ; then
echo "${BASH_REMATCH[@]:1:3}"
fi
done < "$1"

它使用bash-regex匹配来从包含";ELAPSED";。

这个建议假设只有一个空白,而您的示例文本有两个空白。而这份工作的字数和状态大多相同;ENDED OK";。我使用了zsh中的foreach,但这是可以更改的,因为循环、grepping和切割是主要工具。

在本例中,输入文件称为process.txt。

foreach C (`grep "(ORDERID " process.txt|grep " ENDED OK"|cut -d "(" -f 2|cut -d "," -f 1|cut -d " " -f 2`)
line=`grep $C process.txt|grep " ENDED OK"`
job_name=`echo $line|cut -d " " -f 5`
elapsed=`echo $line|cut -d "-" -f 2|cut -d " " -f 2`
echo "$C $job_name $elapsed"
end

输出:

2N000 RECOVERY 0.02
2N001 PROCESS 2.28

最新更新