web-dev-qa-db-ja.com

bashスクリプト変数でsed / awkを使用する

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だけを使用することはできません。変数?

3
Jim

別のオプションは、文字列をスライスすることです。

echo ${name##* }

これにより、文字列がスライスされ、最後のスペースから最後までパーツが保持されます。

${name <-- from name  
  ##   <-- trim the front  
  *    <-- matches anything  
  ' '  <-- until the last ' '  
 }  
11
mazs

最も簡単な方法は、awkを使用して、最後のフィールドを出力するように指示することです。

$ echo "$name" | awk '{print $NF}'
a.resolvers.level3.net

もちろん、必要なのがサーバーのIPだけである場合は、そもそもそれをnameに入れて、後で処理する必要がないようにすることもできます。

name=$(Host $server | awk '{print $NF}')
3
terdon
name=$(Host "$server" | grep -o '[^[:space:]]*$')

hostコマンドの出力の末尾部分を選択します。

3
user218374

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
$
3
Utsav

文字列の操作をまったく含まない、はるかに短い答えは次のとおりです。

Dig +short -x 4.2.2.1

表示されます

a.resolvers.level3.net.

そしてそれ以上は何もありません。もちろん、Digをインストールする必要があります。

3
Ross Presser