web-dev-qa-db-ja.com

sed:ホスト名をパターンとして使用してhostsファイルのipを置き換えます

私はsedについて学んでいますが、それを理解するのは非常に困難です。

私は動的IPを持つadslを持っているので、hostsファイルに現在のIPを置きたいです。

この次のスクリプトは、現在のWAN IPアドレスを通知するだけで、それ以上は通知しません。

IP=$(Dig +short myip.opendns.com @resolver1.opendns.com)
echo $IP

結果:

192.42.7.73

だから、私は古いIPアドレスを持つhostsファイルに行があります:

190.42.44.22   peep.strudel.com

そして私はこのようにHostファイルを更新したい:

192.42.7.73    peep.strudel.com

どうすればいいですか?ホスト名をパターンとして使用できると思います...

これを行う理由は、サーバーがルーターのクライアントであるため、サーバーが直接ではなくゲートウェイを介してインターネットにアクセスするためです。そして、postfixは常に「不明な[x.x.x.x]から接続する」(x.x.x.xは私のWAN IPです!)とログに記録していて、そのIPを解決できません。 fqdnホスト/ドメインに関連してこれを指定すると、hostsファイルでより適切に機能すると思います。

セルジオに感謝します。

11
sergius

sedを使用

sed -r "s/^ *[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+( +peep.strudel.com)/$IP\1/"

[0-9]+\.このパターンで1桁以上に一致するすべての行を4回連続して検索し、パターンpeep.strudel.com。パターンを囲む括弧peep.strudel.comとして保存します\1次に、パッテン全体を変数と新しいIPに置き換えます。

別のアプローチ:パターンをIPという名前の変数に保存する代わりに、sedコマンドライン内でコマンドラインを実行して新しいIPを取得できます。

   sed -r "s/^ *[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+( +peep.strudel.com)/$(Dig +short myip.opendns.com @resolver1.opendns.com)\1/"

gawkを使用

gawk -v IP=$IP '/ *[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+( +peep.strudel.com).*/{print gensub(/ *[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+( +peep.strudel.com)/,IP"\\1","g")}'
4
repzero

簡単なシェルスクリプトを使用できます。

#! /bin/bash

IP=$(Dig +short myip.opendns.com @resolver1.opendns.com)

Host="peep.strudel.com"

sed -i "/$Host/ s/.*/$IP\t$Host/g" /etc/hosts

説明:

sed -i "/$Host/ s/.*/$IP\t$Host/g" /etc/hostsは、$Hostを含む行ですべての.*$IPタブ$Hostに置き換えることを意味します。

13
Tiago Lopo

使用される変数が展開されるように、sedコードを二重引用符で囲む必要があります。

_sed "s/\b\([0-9]\{1,3\}\.\)\{1,3\}[0-9]\{1,3\}\b/$IP/g" file
_

_-i_パラメーターを追加して、加えられた変更を保存します。基本的なsedでは\(..\)はキャプチャグループと呼ばれます。 _\{min,max\}_は範囲数量詞と呼ばれます。

例:

_$ IP='192.42.7.73'
$ echo '190.42.44.22   peep.strudel.com' | sed "s/\b\([0-9]\{1,3\}\.\)\{1,3\}[0-9]\{1,3\}\b/$IP/g"
192.42.7.73   peep.strudel.com
_
2
Avinash Raj