执行 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