从 dig 输出中提取 A 记录和查询时间

从 dig 输出中提取 A 记录和查询时间

执行 dig 命令时,我得到以下输出:

dig @1.1.1.1 google.com  +noall +answer +stats

; <<>> DiG 9.11.4-P1 <<>> @1.1.1.1 google.com +noall +answer +stats
; (1 server found)
;; global options: +cmd
obodrm.prod.at.dmdsdp.com. 86154 IN     A       62.178.85.125
;; Query time: 1 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Wed Sep 11 15:04:35 CEST 2019
;; MSG SIZE  rcvd: 70

我想过滤掉并在一行上显示以下“62.178.85.125”和查询时间:1 毫秒。

答案1

对于 awk 来说非常简单,可以根据可能出现的模式调整确切的匹配条件:

dig @1.1.1.1 google.com  +noall +answer +stats | \
  awk '$3 == "IN" && $4 == "A"{ip=$5}/Query time:/{t=$4 " " $5}END{print ip, t}'

答案2

使用 grep,

dig @1.1.1.1 google.com  +noall +answer +stats | grep -oEe "\b([0-9]{1,3}\.){3}[0-9]{1,3}$" -oEe 'Query time: [0-9]+ msec'
  • -oEe "\b([0-9]{1,3}\.){3}[0-9]{1,3}$"将在任意行的末尾 grep 一个 IP 地址

  • -oEe 'Query time: [0-9]+ msec'grep 查询时间。

答案3

使用 GNU sed

dig @1.1.1.1 google.com  +noall +answer +stats | \
  sed -nEz 's/.*[[:space:]]([0-9.]+)\n;; (Query time[^\n]*\n).*/\1 \2/p'

使用sed-z选项,输入将被处理为一个大字符串,并且选项-n仅打印匹配的部分 ( /p)。由于 ip 地址后面紧跟着换行符 和;; Query time,因此我们可以使用更简单的正则表达式来匹配 ip。两个字符串都被捕获在一个组中,并且通过引用这些组来(…)替换输入。\1 \2

相关内容