Shell命令与操作符后跟管道

时间:2014-12-04 19:29:46

标签: linux bash shell

我想要一行命令从JBoss重启日志中获取最近的重启日期。我目前正在使用以下工具

ls -rt $JBOSS_HOME/log/ser* | 
xargs grep -ih "Incomplete\s*Deploy" | 
awk '{print $1" "$2}' | tail -n 1 

现在,如果grep无法匹配任何内容,我想添加一个echo,即:

ls -rt $JBOSS_HOME/log/ser* | 
xargs grep -ih "Incomplete\s*Deploy" || 
echo 'NO RESTART' | 
awk '{print $1" "$2}' | 
tail -n 1 

这里的问题是,现在看来OR运算符会导致跟随失败的情况。如何指定只在grep失败时才打印OR(echo)?当grep成功时,它应该像我发布的第一个命令一样工作。

3 个答案:

答案 0 :(得分:1)

您可以使用括号对管道内的命令进行分组:

ls -rt $JBOSS_HOME/log/ser* | ( xargs grep -ih "Incomplete\s*Deploy" || echo 'NO RESTART' ) | awk '{print $1" "$2}' | tail -n 1 

这使得括号中的命令在子shell中运行,从管道的角度来看,它使它们作为单个命令工作,即它们将接受输入并打印grep匹配或'NO RESTART',然后将其输入awk

答案 1 :(得分:1)

使用{对字词进行分组:

ls -rt $JBOSS_HOME/log/ser* | 
xargs grep -ih "Incomplete\s*Deploy" && { 
    awk '{print $1" "$2}' | 
    tail -n 1 
} ||
echo 'NO RESTART'

或作为一行:

ls -rt $JBOSS_HOME/log/ser* | xargs grep -ih "Incomplete\s*Deploy" && { awk '{print $1" "$2}' | tail -n 1; } || echo 'NO RESTART'

不需要额外的子shell。

答案 2 :(得分:0)

res=$(ls -rt $JBOSS_HOME/log/ser* | xargs grep -ih "Incomplete\s*Deploy" | awk '{print $1" "$2}' | tail -n 1)

echo "${res:-NO RESTART}"

另请注意,对于包含空格/等的文件名,这是不安全的。