IoT等で外部のイベントを契機にして、サーバやデバイス上にあるOSの設定ファイルを書き換えたり、
AWSのUser Dataにスクリプトを仕込み、EC2起動時にOS上の設定ファイルを書き換えたい時があります。
viやvim等の対話型エディタを開いて編集するのではなく「コマンド一発で設定ファイルの一部を書き換える」ために
sedコマンドで正規表現を指定し、Linuxの設定ファイルの中身を書き換えてみました。
以下は、Zabbixの設定ファイルをsedコマンドで書き換えるサンプルです。
(CentOS7、RHEL7で動作確認)
before確認
まずは現状を確認します。
# 元々コメントアウトされている場合
sudo grep "^ *# php_value date.timezone" /etc/httpd/conf.d/zabbix.conf
# コメントアウトされていない場合
sudo grep "^ *php_value date.timezone" /etc/httpd/conf.d/zabbix.conf
初期状態で1番目のコマンドを実行すると、以下のようになっていました。
ここから、viやvimを使わずに、タイムゾーンをAsia/Tokyoに書き換えます。
# php_value date.timezone Europe/Riga
置換処理
sedコマンドで置換箇所を特定するパターンを正規表現で書いた後、c\の後ろに置換後の文字列を書くと、
その行ごと置換できます。
設定ファイルのバックアップを取ってから、以下を実行します。
# 元々コメントアウトされている場合
sudo sed -i -e "/^ *# php_value date.timezone/c\ php_value date.timezone Asia/Tokyo" /etc/httpd/conf.d/zabbix.conf
# コメントアウトされていない場合
sudo sed -i -e "/^ *php_value date.timezone/c\ php_value date.timezone Asia/Tokyo" /etc/httpd/conf.d/zabbix.conf
例えば、「USER=aaa」の行を「USER=abc」と編集したいときは
「/^USER=/c\USER=abc」と書けば良いです。
そして、後ろに設定ファイルのパスを書けばOK。
簡単ですね。
雑な言い方をすると、このやり方であれば、何とでもなります。捗りますよ。
after確認
結果も以下のコマンドで確認します。
# コメントアウトされている行がないことの確認
sudo grep "^ *# php_value date.timezone" /etc/httpd/conf.d/zabbix.conf
# 想定通り置換されたことの確認
sudo grep "^ *php_value date.timezone" /etc/httpd/conf.d/zabbix.conf
2番目のコマンドを実行すると、以下のようになり、設定が書き換わっていることを確認できます。
php_value date.timezone Asia/Tokyo
この方法を使えば、コマンドだけでは変更できない設定も、 自動で変更できるようになり、いろいろと捗るようになります。
2018/8/14追記: sedもエディタである
お恥ずかしながら「sed」=「stream editor」という由来を全く知らずに、記事を書いておりました。(無学がバレてしまいます。。。)
「対話型エディタを使わないで編集する」という意図で、ご理解いただけますと幸いです。
ご指導いただきました全ての方に、感謝申し上げます。