我的部分文件如下:
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但仍然什么都没有。
请帮忙吗?
答案 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)