我发现自己经常需要更新 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))";}'
另一种方法是使用tmux
或screen
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"; }'