如何在awk中包含dig查找?

时间:2014-01-07 17:05:27

标签: awk dig

我有一个awk命令从挂载点提取信息(参见How to extract NFS information from mount on Linux and Solaris?中接受的答案):

awk -F'[: ]' '{if(/^\//)print $3,$4,$1;else print $1,$2,$4}

我想在此awk命令中包含dig查找以查找主机名的IP。不幸的是,mount命令有时包括IP,有时还包括主机名。我尝试了以下操作,但它有一个不需要的换行符,不需要的返回代码,如果有IP地址则不起作用:

对于主机名

echo "example.com:/remote/export on /local/mountpoint otherstuff" | awk -F'[: ]' '{if(/^\//)print system("dig +short " $3),$4,$1;else print system("dig +short " $1),$2,$4}'

返回

93.184.216.119
0 /remote/export /local/mountpoint

适用于IP

echo "93.184.216.119:/remote/export on /local/mountpoint otherstuff" | awk -F'[: ]' '{if(/^\//)print system("dig +short " $3),$4,$1;else print system("dig +short " $1),$2,$4}'

返回

0 /remote/export /local/mountpoint

我想在两种情况下检索以下内容

93.184.216.119 /remote/export /local/mountpoint

更新

当IP作为查询提供时,某些版本的dig会返回IP,而其他版本则不返回任何内容。

解决方案:

基于accepted answer,我使用了以下改编的awk命令:

 awk -F'[: ]' '{if(/^\//) { system("dig +short "$3" | grep . || echo "$3" | tr -d \"\n\""); print "",$4,$1 } else { system("dig +short "$1" | grep . || echo "$1" | tr -d \"\n\"");print "",$2,$4  };}'

如果dig没有返回任何内容,则额外的grep . || echo "$3"会注意返回输入的IP /主机名。

1 个答案:

答案 0 :(得分:3)

system中的awk命令执行命令返回其状态。考虑一下:

$ awk 'END { print "today is " system("date") " and sunny" }' < /dev/null
Tue Jan  7 20:19:28 CET 2014
today is 0 and sunny

date命令输出日期和换行符。从awk运行时,会发生同样的事情。在此示例中,systemprintf之前完成,因此首先我们看到包含日期的行,在下一行中我们的文本的返回值为system

要获得我们想要的东西,我们需要将其拆分为多个命令,我们不需要system的返回值:

$ awk 'END { printf "today is "; system("date | tr -d \"\n\""); print " and sunny" }' < /dev/null
today is Tue Jan  7 20:24:01 CET 2014 and sunny

要阻止date之后的换行符,我们会将其输出设为tr -d "\n"

长话短说,改变一下:

print system(...), $2, $4

到此:

system(... | tr -d \"\n\"); print "", $2, $4