Разобрать два значения из файла
Часть моего файла выглядит так:
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
Он ищет строки, содержащие вашу конкретную строку, устанавливает разделитель как = между двумя и принимает поле справа от него.