使用AWK修剪命令的输出

时间:2016-05-09 16:38:49

标签: linux awk

我一直在使用FreeBSD设置我自己的DNS服务器,我几乎做了所有事情。 为了编写用于记录和监视区域中不同域的自定义脚本,我使用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:Received 1108 bytes from 192.168.82.1#53 in 0 ms之间的部分写入文件?我正在阅读awk,但我不明白如何使用它来打印命令输出的某些部分。

预期输出

abc.unix
xyz.unix

谢谢

3 个答案:

答案 0 :(得分: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}'

测试:

$ 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

答案 1 :(得分:3)

在awk中你可以试试这个:

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

给定示例的输出

abc.unix
xyz.unix

当前行包含“;; ANSWER SECTION:”时,第一行设置a=1。如果a=1 当前行未以“已接收”开头,则我们会打印整行。 (如果要抑制空行,可以将&& $0 != ""添加到(a && $0 !~/^Received/)

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

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

答案 2 :(得分:2)

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

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

会这样做。

输出

abc.unix
xyz.unix

q命令很方便,因为一旦打印完所需的部分,它就会停止处理。