我一直在努力使用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
命令很方便,因为打印所需部分后将停止处理。