从文件中解析两个值

时间:2014-03-14 12:36:46

标签: bash sed text-parsing string-parsing

我的部分文件如下:

STATUS REPORT FOR JOB: Job_logging
Generated: 2014-03-14 07:05:03
   Job start time=2014-03-13 06:37:49
   Job end time=2014-03-13 06:37:51
   Job elapsed time=00:00:02
   Job status=1 (Finished OK)
      Stage: Oracle_Connector_0, 1 rows input
      Stage start time=2014-03-13 06:37:51, end time=2014-03-13 06:37:51, elapsed=00:00:00
         Link: DSLink2, 1 rows
      Stage: Peek_3, 1 rows input
      Stage start time=2014-03-13 06:37:51, end time=2014-03-13 06:37:51, elapsed=00:00:00

     Status code = 0
     Link: DSLink2, 1 rows

我需要提取代表作业开始时间和作业结束时间的值

所以我需要将 2014-03-13 06:37:49 2014-03-13 06:37:51 保存到两个单独的变量中:v1和v2。

如何使用BASH做到这一点?

我已经杀了大约一个小时玩字符串连接和sed但仍然什么都没有。

请帮忙吗?

5 个答案:

答案 0 :(得分:2)

使用awk可以在单行中找到:

awk -F 'Job (start|end) time=' 'NF>1{print $2}' file
2014-03-13 06:37:49
2014-03-13 06:37:51

读取变量中的两个值:

IFS=';' && read v1 v2 < <(awk -F 'Job (start|end) time=' 'NF>1{printf "%s;", $2}' file)

答案 1 :(得分:0)

您可以使用grep

$ grep -Po '(?<=Job start time=).*' file
2014-03-13 06:37:49

$ grep -Po '(?<=Job end time=).*' file
2014-03-13 06:37:51

它使用了一个后视来检查给定文件中Job start/end time=之后的内容。

要存储到变量中,请使用

$ var=$(grep -Po '(?<=Job end time=).*' file)
$ echo "$var"
2014-03-13 06:37:51

答案 2 :(得分:0)

这很简单易读:

grep "Job start time" test.txt | cut -d"=" -f2
grep "Job end time" test.txt | cut -d"=" -f2

这会搜索包含您特定字符串的行,将分隔符设置为两者之间的=,并取右边的字段。

答案 3 :(得分:0)

使用sed

v1=$(sed -rn 's/.*Job start time=(.*)/\1/p' yourfile)
v2=$(sed -rn 's/.*Job end time=(.*)/\1/p' yourfile)

答案 4 :(得分:0)

eval `sed -n 's/^ *Job start time=\(.*\)/v1="\1"/p
s/^ *Job end time=\(.*\)/v2="\1"/p' YourFile`

在aix / bash上测试(所以没有GNU sed)