Bash 单行程序显示 DNS 更新(TTL 到期)的倒计时

Bash 单行程序显示 DNS 更新(TTL 到期)的倒计时

我发现自己经常需要更新 DNS 记录,并且需要确切知道刷新何时开始(即 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命令包装起来,以便我可以让它在终端中运行并获得实时倒计时。例如:

$ 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

我很确定这是某种管道/引用问题,但我不太了解其中的复杂性。为了便于移植,我宁愿将其保留为一行,而不是求助于需要保存到磁盘的脚本。有人知道完成此操作的正确方法吗?

答案1

首先你需要避免使用 expr。它很少使用。相反,我这里有一个完全相同的版本。与上面的没有太大区别:

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

另一种方法是使用tmuxscreen

    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

祝你好运。

答案2

为什么不让 AWK 进行计算和打印?

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

答案3

语法错误问题,因为你忘记转义字符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)\"; }"

答案4

这对我似乎有用。

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"; }'

相关内容