2016-05-09 13 views
2

私は自分自身のDNSサーバをFreeBSDでセットアップしようとしていて、ほとんどすべてを行っています。 ゾーン内の異なるドメインのログを記録して監視するためのカスタムスクリプトを書くために、私はhost -a -l mydomain.comコマンドを使用しています。コマンドは与えられたドメイン内のすべてのサブドメインを表示します。私はこのコマンドの出力を> outputを使ってファイルに書き出しています。 問題は、出力には他にもいくつかのデータがあり、それは私にとっては興味がないことです。AWKを使用してコマンドの出力を調整します

持つセクション以下、このコマンドの出力、

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6149 
;; flags: qr aa ra; QUERY: 1, ANSWER: 45, AUTHORITY: 0, ADDITIONAL: 0 

;; QUESTION SECTION: 
;unix.       IN  AXFR 

;; ANSWER SECTION: 
abc.unix 
xyz.unix 

Received 1108 bytes from 192.168.82.1#53 in 0 ms 

は私が単にシンプルなターミナルコマンドを使用してファイルへ;; ANSWER SECTION:Received 1108 bytes from 192.168.82.1#53 in 0 ms間のセクションを読み書きできることをとにかくありますか?私はawkについて読んでいますが、コマンドの出力の特定の部分だけを印刷するためにどのように使用できるのか分かりません。

の予想される出力

abc.unix 
xyz.unix 

これはsed

hostname -a -l mydomain.com | sed -n '/;; ANSWER/{n;N;p;q}' 

がそれを行うだろう使用することができ、簡単な要件である

答えて

3

この状況では、awkコマンドが便利です。

これに試してみて:

awk '/^;; ANSWER SECTION:/ , /^Received [0-9]* bytes from [0-9.#]* in [0-9.] ms/ {if ($0 !~ /^;; ANSWER SECTION:/ && $0 !~ /^Received [0-9]* bytes from [0-9.#]* in [0-9.] ms/) print}' 

テストを:awkでは

$ host -a -l mydomain.com | awk '/^;; ANSWER SECTION:/ , /^Received [0-9]* bytes from [0-9.#]* in [0-9.] ms/ {if ($0 !~ /^;; ANSWER SECTION:/ && $0 !~ /^Received [0-9]* bytes from [0-9.#]* in [0-9.] ms/) print}' 
abc.unix 
xyz.unix 
+0

このコマンドええoutput'は、ファイルパスであることを期待し 'が、私は、コマンドないファイルを使用する必要があり、私が試した' |ホスト-a -l mydomain.com'どこ?。あなたのコマンドに 'output'を書いても動作しませんでした –

+0

@RileyWillowあなたは' host -a -l mydomain。com | awk '/^;;答えセクション:/、/^[0-9。]の[0-9。#] *から[0-9] *バイトを受け取りましたms/{if($ 0!〜/^;;回答セクション:/ && $ 0! 〜/^[0-9。]から[0-9。*]までのバイト数[0-9。] ms /)print} '' –

+0

素晴らしい!それは動作します、私は間違ってパイプをやっていた:)お返事に –

2

ありがとうございます。

出力

abc.unix 
xyz.unix 

必要な部分が印刷されると、それは処理を停止しますようqコマンドが便利です。

3

をあなたはこの試みることができる:与えられた例

ため

awk '$0~/;; ANSWER SECTION:/{a=1; next} 
    (a && $0 !~/^Received/)' input 

出力を

abc.unix 
xyz.unix 

最初の行は、現在の行に ";;"が含まれている場合はa=1になります。 ANSWERセクション:その後、我々は全体のラインを印刷し、 『受信」。現在の行は始まらないa=1場合は、』(あなたは空行を抑制したい場合は、(a && $0 !~/^Received/)&& $0 != ""を追加することができます)

組み合わせで。あなたのコマンドhost -a -l mydomain.comで:

host -a -l mydomain.com | awk '$0~/;; ANSWER SECTION:/{a=1; next} 
     (a && $0 !~/^Received/)' 
+0

ヒープありがとう、私は '入力'のファイル名を書く必要がありますか?私はファイルの代わりに 'host -a -l mydomain.com'コマンドを提供する必要があります。 –

+0

まず、コマンドの出力をファイルに保存してから、そのファイルのコマンドを実行する必要がありますか? –

関連する問題