在没有echo $ data |的情况下,在命令替换中仅从一行提取数据

时间:2017-04-10 18:51:43

标签: bash shell

我有一个命令,我想运行并从中获取输出。这是命令:

sh execute_odi_script.sh Audit_ExecutionLogStart.sql heelo

它应该返回

Begin Informatica Script 18 Redshift Delta copy completed at: 04/10/17 18:46:20 END

现在我需要只获取SQL文件的输出,在这种情况下为18

有人能够帮助我实现这一目标,但前提是我分两步完成:

> logStart=$( sh execute_odi_script.sh Audit_ExecutionLogStart.sql heelo ) 
> echo $logStart | sed -r s/.*Begin\ Informatica\ Script\ \(\.*\)\ Redshift\ Delta.*/\\1/ ); echo $logStart
18

我一直试图解决我如何进行命令替换,但我很难理解甚至改变什么。我如何在一行中完成所有这些?

1 个答案:

答案 0 :(得分:0)

首先 - 如果您只关心一行,grep为该行:

logStart=$( sh execute_odi_script.sh Audit_ExecutionLogStart.sql heelo \
            | grep -e "Begin Informatica Script" \
            | sed -r 's/.*Begin Informatica Script (.*) Redshift Delta.*/\1/' )
echo "$logStart"

或者,您可以在命令替换中使用整个管道:

logStart=$( sh execute_odi_script.sh Audit_ExecutionLogStart.sql heelo \
            | tr '\n' ' ' \
            | sed -r 's/.*Begin Informatica Script (.*) Redshift Delta.*/\1/' )
echo "$logStart"

如果您想避免将echo作为单独步骤,可以在管道末尾添加| tee /dev/stderr(同样, in $() )。