LoginSignup
14
17

More than 5 years have passed since last update.

Linuxの設定ファイルの中身を部分的に書き換える方法

Last updated at Posted at 2018-08-11

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

14
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
17