我有一个awk命令从装载点提取信息(请参阅如何在Linux和Solaris上从装载提取NFS信息?):
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
更新:
似乎dig
的某些版本在提供IP作为查询时返回IP,而其他版本则不返回任何IP。
解决方案:
根据接受的答案,我使用了以下经过调整的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/主机名。
awk
中的system
命令执行一个返回其状态的命令。考虑一下:
$ 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
运行时也会发生同样的情况。在本例中,system
在printf
之前结束,因此首先我们看到带有日期的行,在下一行我们看到的文本的返回值为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