発掘出力からAレコードとクエリ時間を抽出します。

発掘出力から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」とクエリ時間1msをフィルタリングして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

グレブを使って、

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}$"行末で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オプションを使用すると、入力は1つ-zの大きな文字列として扱われ、オプションは一致-nする部分(/p)のみを印刷します。 IPアドレスの後には改行文字が続くので、;; Query timeより単純な正規表現を使用してIPを一致させることができます。どちらの文字列もグループとしてキャプチャされ、(…)入力はグループを参照して置き換えられます。\1 \2

関連情報