3

我有一个 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,而其他版本则不返回任何内容。

解决方案:

根据接受的答案,我使用了以下改编的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  };}'

grep . || echo "$3"如果 dig 没有返回任何内容,则附加功能会返回输入 IP/主机名。

4

1 回答 1

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同样的事情运行时会发生。在这个例子中,system完成在printf它自己之前,所以首先我们看到带有日期的行,在下一行我们的文本带有返回值 0 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
于 2014-01-07T19:28:24.497 回答