私は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ファイルでより適切に機能すると思います。
セルジオに感謝します。
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")}'
簡単なシェルスクリプトを使用できます。
#! /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
に置き換えることを意味します。
使用される変数が展開されるように、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
_