Разобрать два значения из файла

Часть моего файла выглядит так:

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 ответов

Решение

Ты можешь использовать 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

Используя 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)

С sed:

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

протестировано на aix/bash (поэтому нет GNU sed)

Это просто и легко читается:

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

Он ищет строки, содержащие вашу конкретную строку, устанавливает разделитель как = между двумя и принимает поле справа от него.

Другие вопросы по тегам