Bash单行显示正在运行的倒计时,直到DNS更新(TTL到期)

我发现自己经常负责更新DNSlogging,并且需要知道刷新何时开始(又称TTL过期)。 我想出了这个bash单行,给了我想要的输出:

$ dig +noall +answer www.google.com | \ > awk '{ print $2 }' | \ > { read secs; echo "`expr $secs / 60`m `expr $secs % 60`s remaining ($secs)"; } 

输出:

 3m 36s remaining (216) 

我希望能够围绕这个watch命令,以便我可以让它在terminal运行,并得到一个实时倒计时。 就像是:

 $ watch -n 10 "dig +noall +answer www.google.com | \ > awk '{ print $2 }' | \ > { read secs; echo '`expr $secs / 60`m `expr $secs % 60`s remaining ($secs)'; }" 

但是,这只会导致一个不起作用的手表实例,然后是:

 expr: syntax error 

我很确定这是某种pipe道/引用问题,我对这些错综复杂的问题不太了解。 为了便于携带,我宁愿把它作为一个单一的手段,而诉诸于需要保存到磁盘的脚本。 有谁知道正确的方法来完成这个?

首先你需要避免使用expr。 它很less使用。 相反,我在这里的版本完全相同。 与以上没有太大的不同:

 watch -n1 'dig +noall +answer google.com | \ awk "{print \$2}" | \ { read secs; echo "$((secs / 60 ))m $((secs % 60))s remaining $((secs))";}' 

另一个可以使用tmuxscreen tmux

  while sleep 1; do dig +noall +answer google.com | \ { while read -r secs; do echo "$((secs / 60 ))m $((secs % 60))s remaining $((secs)) seconds"; done < <(awk '{print $2}' | \ head -n1 ); }; done 

祝你好运。

为什么不让AWK做math和印刷?

 watch -n 10 'dig +noall +answer google.com | awk '\''{print int($2 / 60) "m", $2 % 60 "s remaining", "(" $2 ")"; exit}'\''' 

语法错误的问题,因为你忘了逃避backstick字符, double quote字符。 并且还要记住要避免dollar sign ,因为$ secs的值传递给expr ,如果不这样做,则不会有输出到stdout:

 watch -n 10 "dig +noall +answer www.google.com | \ awk '{print\$2}' | \ { read secs; echo \"\`expr \$secs / 60\`m \`expr \$secs % 60\`s remaining (\$secs)\"; }" 

这似乎为我工作。

 watch -n 10 "dig +noall +answer www.google.com | \ awk '{print \$2}' | \ { read secs; echo \"\$((\$secs / 60))m \$((\$secs % 60))s remaining\"; }" 

或者引用以避免相当多的混乱:

 watch -n 1 'dig +noall +answer www.google.com | \ awk "{print \$2}" | \ { read secs; echo "$(($secs / 60))m $(($secs % 60))s remaining"; }'