我发现自己经常负责更新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))";}'
另一个可以使用tmux或screen 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"; }'