使用AWK修剪命令的输出

我一直在努力使用FreeBSD来设置自己的DNS服务器,而且我已经完成了几乎所有的事情。 为了编写一个自定义脚本来logging和监视区域中的不同域,我使用了host -a -l mydomain.com命令,该命令显示了给定域中的所有子域。 我正在使用> output将此命令的输出写入文件。 问题是,输出还有一些其他的数据,这对我来说是没有意义的。

这个命令的输出有以下部分,

 ;; ->>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: ;; ANSWER SECTION:和使用简单的terminal命令Received 1108 bytes from 192.168.82.1#53 in 0 ms ? 我正在阅读有关awk但我不明白如何才能使用它来打印命令输出的某些部分。

预期产出

 abc.unix xyz.unix 

谢谢

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}' 

考试:

 $ 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 

在awk中,你可以试试这个:

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

给定示例的输出

 abc.unix xyz.unix 

当前行包含“;; ANSWER SECTION:”时,第一行设置a=1 。 如果a=1 并且当前行不是以“Received”开始,那么我们打印整个行。 (如果你想压制空行,你可以添加&& $0 != ""(a && $0 !~/^Received/)

结合您的命令host -a -l mydomain.com

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

这是sed可以使用的简单要求

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

会做到这一点。

产量

 abc.unix xyz.unix 

q命令很方便,因为打印所需部分后将停止处理。