ShellScript
Bash
Linux
sed
IoT

対話型エディタを使わず、Linuxの設定ファイルを書き換える方法

IoT等で外部のイベントを契機にして、サーバやデバイス上にあるOSの設定ファイルを書き換えたり、
AWSのUser Dataにスクリプトを仕込み、EC2起動時にOS上の設定ファイルを書き換えたい時があります。

viやvim等の対話型エディタを開いて編集するのではなく「コマンド一発で設定ファイルの一部を書き換える」ために
sedコマンドで正規表現を指定し、Linuxの設定ファイルの中身を書き換えてみました。

以下は、Zabbixの設定ファイルをsedコマンドで書き換えるサンプルです。
(CentOS7、RHEL7で動作確認)

before確認

まずは現状を確認します。

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\の後ろに置換後の文字列を書くと、
その行ごと置換できます。
設定ファイルのバックアップを取ってから、以下を実行します。

replace
# 元々コメントアウトされている場合
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確認

結果も以下のコマンドで確認します。

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」という由来を全く知らずに、記事を書いておりました。(無学がバレてしまいます。。。)
「対話型エディタを使わないで編集する」という意図で、ご理解いただけますと幸いです。
ご指導いただきました全ての方に、感謝申し上げます。