我想要一行命令从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成功时,它应该像我发布的第一个命令一样工作。
答案 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}"
另请注意,对于包含空格/等的文件名,这是不安全的。