DNSサーバーの名前を取得しようとしています4.2.2.1
。
Host 4.2.2.1
を使用すると、次の出力が得られます。
1.2.2.4.in-addr.arpa domain name pointer a.resolvers.level3.net
私のスクリプトでは、これを次のように行います。
name="$($Host $server)"
$name
でsed/awkを使用してa.resolvers.level3.net
のみを取得するにはどうすればよいですか。これは完全に異なるサーバーで使用するため、grep a.resolvers
だけを使用することはできません。変数?
別のオプションは、文字列をスライスすることです。
echo ${name##* }
これにより、文字列がスライスされ、最後のスペースから最後までパーツが保持されます。
${name <-- from name
## <-- trim the front
* <-- matches anything
' ' <-- until the last ' '
}
最も簡単な方法は、awk
を使用して、最後のフィールドを出力するように指示することです。
$ echo "$name" | awk '{print $NF}'
a.resolvers.level3.net
もちろん、必要なのがサーバーのIPだけである場合は、そもそもそれをname
に入れて、後で処理する必要がないようにすることもできます。
name=$(Host $server | awk '{print $NF}')
name=$(Host "$server" | grep -o '[^[:space:]]*$')
hostコマンドの出力の末尾部分を選択します。
sed
の代替も置くだけです。これにより、空白で区切られた文字列から最後の列が印刷されます。
sed 's/.*[[:space:]]\(.*\)$/\1/'
a.resolvers.level3.net
が$ name変数の唯一の文字列であり、機能する場合についてテストしました。
$ echo "$name"
1.2.2.4.in-addr.arpa domain name pointer a.resolvers.level3.net
$
$ echo "$name"|sed 's/.*[[:space:]]\(.*\)$/\1/'
a.resolvers.level3.net
$
$ name="a.resolvers.level3.net"
$ echo "$name"|sed 's/.*[[:space:]]\(.*\)$/\1/'
a.resolvers.level3.net
$
文字列の操作をまったく含まない、はるかに短い答えは次のとおりです。
Dig +short -x 4.2.2.1
表示されます
a.resolvers.level3.net.
そしてそれ以上は何もありません。もちろん、Digをインストールする必要があります。