我正在寻找unix命令来将以下字符串解析为所需的格式,如下所示。
已连接到集成服务:[is_infa01]。集成服务状态:[正在运行]Integration Service启动时间:[5月9日星期一10:27:22 2016]集成服务当前时间:【孙军05 21:57:332016]文件夹:[TEST]工作流:[wf_MASTER_DAILY]版本[2]。工作流运行状态:[成功]工作流运行错误代码:[0]工作流运行错误消息:[已成功完成。]工作流运行id[42197]。开始时间:【2016年6月4日星期六13:14:11】结束时间:【6月4号星期六13:20:372016]工作流日志文件:[/informatica/pc961/server/infa_shared/Working/inf01/WorkflowLogs/wf_MASTER_DAYLY.log]
我希望解析上面的字符串并获得下面的输出(日期格式为YYYY-MM-DD HH:MM:DD)
Workflow run status|Start time|End time
Succeeded|2016-06-04 13:14:11|2016-06-04 13:20:37
我可以得到像下面这样的单个值的值
grep "Workflow run status:" | cut -d'[' -f2 | cut -d']' -f1
grep "Start time:" | cut -d'[' -f2 | cut -d']' -f1
grep "End time:" | cut -d'[' -f2 | cut -d']' -f1
但是如何使用日期格式生成所需的输出呢?
如果您可以使用grep
表达式获得"开始时间"值,那么如果您有-d
选项,则可以使用下面的date
命令将其转换为所需的时间戳,例如:
date -d 'Sat Jun 04 13:14:11 2016' +'%Y-%m-%d %T'
假设GNU grep,您可以像这样包装它:
string="Connected to Integration Service: [is_infa01]. Integration Service status: [Running] Integration Service startup time: [Mon May 09 10:27:22 2016] Integration Service current time: [Sun Jun 05 21:57:33 2016] Folder: [TEST] Workflow: [wf_MASTER_DAILY] version [2]. Workflow run status: [Succeeded] Workflow run error code: [0] Workflow run error message: [Completed successfully.] Workflow run id [425197]. Start time: [Sat Jun 04 13:14:11 2016] End time: [Sat Jun 04 13:20:37 2016] Workflow log file: [/informatica/pc961/server/infa_shared/Working/infa01/WorkflowLogs/wf_MASTER_DAILY.log]"
w="Workflow run status" s="Start time" e="End time"
{
printf "%sn" "$w" "$s" "$e"
grep -oP "$w: \[\K.*?(?=\])" <<<"$string"
date -d "$(grep -oP "$s: \[\K.*?(?=\])" <<<"$string")" "+%F %T"
date -d "$(grep -oP "$e: \[\K.*?(?=\])" <<<"$string")" "+%F %T"
} | paste -d'|' - - -
输出
Workflow run status|Start time|End time
Succeeded|2016-06-04 13:14:11|2016-06-04 13:20:37
以下是grep&格式化日期
grep "Start time:" | cut -d'[' -f2 | cut -d']' -f1 | read dt ; date -d "$dt" +'%Y-%m-%d %T'