web-dev-qa-db-ja.com

bashスクリプトでファイルを編集する

私はbashスクリプトの初心者です。Linuxボックスに自動でインストールと構成を行うためのbashスクリプトを作成したいと思います。

編集したいとします

/etc/yum.repos.d/epel.repo

bashスクリプトによる

私がしたいことは次のとおりです

  1. ファイル/etc/yum.repos.d/epel.repoを開きます
  2. [epel]セクションを検索
  3. Epelセクションのline enabled = 1の直後にline priority = 10を追加します

追加した最初の部分について

yum install nano
nano /etc/yum.repos.d/epel.repo

私の質問は、nanoを使用してbashスクリプトで2番目と3番目の部分を実行する方法です(可能な場合、不可能の場合はsedで表示してください)。

また、いくつかの時点で、ファイルの変数を変更する必要があります。

  1. enable = 0からenable = 1
  2. Testing = "1"からTesting = "0"
  3. 行にテキストを追加します。 functions = to function = "text1"、 "text2"
  4. テキストをファイルに追加して保存します(nanoを使用)

私はその厳しいことを知っていますが、サーバー管理に慣れていない友人のためにこれを作成する必要があります。残念ながら、私は最初からbashスクリプトを勉強する時間がないので、私の試験に近いので、スクリプトを書くために例を使用します。


私がbashスクリプトのほとんどを成功させたすべての返信にみんなありがとう

ただし、別の問題があります。sedを使用してnginx.confを変更したいとします。worker_processesを扱います。
今、私はsedを使用して次のことを行いたいです1.そのconfでworker_processesの-​​最初の出現を見つけ、テキストをworker_processes 4;で置き換えます

ここでの特記事項:これは単なる例です。 confにworker_processes 1が含まれている場合があります。 。これは難しい部分です。 最初の完全一致ケース Wordのworker_processesを見つけるsedコマンドが必要です。Wordが見つかったテキスト行を削除し、そこにworker_processes 4;を貼り付けます。次にファイルを保存します。これは、ファイルを編集するときの最も信頼できる方法です(confを壊す危険はありません)

私がsed -i 's/enabled = 0/enabled = 1/g' /etc/yum.repos.d/remi.repoを使用して、remiの[remi]セクションでenabled = 0をenabled = 1に変更する最後の提案.repo。ただし、そのファイル内のすべてのenabled = 0を変更する可能性があると感じています。これにより、サーバーが破損します。より良いコードを提案できますか。


私が確信していない別のもの:PIはこれをテキストテスト= "0"として含むファイルを編集したい(はい、引用符があり、それを保持する必要があります)テスト= "0"からテスト= "に変更する必要があります1インチ(引用符付き)

また、私はsedのようにファイルの最後に引用符付きのテキストを追加する必要があります "Thanks Quanta"(引用符付き)phpの場合は、引用符をエコーし​​て\を入れ、bashでどのように行われるかわからない

別物
設定の行を変更する必要がありますが、置換するテキスト全体が何であるか覚えていません

そのリッスン=何かのように; 、リッスンするように変更したい= /tmp/php5-fpm.sock;

量子を上げるための大きな親指

素晴らしいサポート担当者に感謝します

12
Werulz
sed '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo

必要に応じて、インプレース編集オプション(-i)を指定します(最初に.bak拡張子でバックアップを作成します)。

sed -i.bak '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo

今、私はsedを使用して次のことを実行したいと考えています。

sed '0,/worker_processes [0-9]*;/s//worker_processes 4;/' /etc/nginx/nginx.conf

最後に、sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repoを使用して、enabled=0enabled=1セクションの下にある[remi]remi.repoに変更しました。しかし、私はそれがそのファイルのすべてのenabled=0を変更する可能性があると感じています。これにより、サーバーが破損します。誰でもより良いコードを提案できますか?

ここにあなたのために:

sed '/\[remi\]/,/enabled=0/ { s/enabled=0/enabled=1/ }' remi.repo

私が確信していない別のもの:PIはこれをテキストテスト= "0"として含むファイルを編集したい(はい、引用符があり、それを保持する必要があります)テスト= "0"からテスト= "に変更する必要があります1インチ(引用符付き)

sed 's/Testing = "0"/Testing = "1"/g'

また、私はsedのようにファイルの最後に引用符付きのテキストを追加する必要があります "Thanks Quanta"(引用符付き)

sed '$a"Werulz, you are welcome"\'

Confの行を変更する必要がある別のことですが、置き換えるテキスト全体が何であるか覚えていません

その聞く=何かのように; 、リッスンするように変更したい= /tmp/php5-fpm.sock;

sed 's/listen = .*/listen = \/tmp\/php5-fpm.sock;/'
18
quanta

Ptmanが言ったように、 Augeassed/awkを使用することからあなたを救うことができます:

$ augtool -s set /files/etc/yum.repos.d/epel.repo/epel/priority 10

epelリポジトリの優先度を10に設定します。priorityキーがすでに存在する場合は、その値を設定します。それ以外の場合は、最後のエントリの後にpriorityエントリを追加しますセクションで。

変更したい他の値についても同様です。

複数の値を変更する場合は、augtoolをインタープリターとして使用することもできます。

$ cat epel.augtool
#!/usr/bin/augtool -sf

# Make a variable
defvar epel /files/etc/yum.repos.d/epel.repo/epel

# Set values
set $epel/enable 1
set $epel/priority 10
set $epel/Testing 0
$ chmod +x epel.augtool
$ ./epel.augtool
Saved 1 file(s)

これをbashスクリプトに残したい場合は、コマンドをaugtoolにパイプできます。

cat <<EOF | augtool
# Make a variable
defvar epel /files/etc/yum.repos.d/epel.repo/epel

# Set values
set $epel/enable 1
set $epel/priority 10
set $epel/Testing 0
save
EOF

その他のオプションについては、man augtoolをご覧ください。

Augeasとsed/awkの使用にはいくつかの利点があります。

  • Augeasには、ファイル構文(この場合はyum.repo構文)を認識するパーサーがあります。正規表現が間違っていても、ファイルの構文が壊れるリスクはありません。
  • augeas yum.repoパーサーはyum.repoセクションを認識しているため、正しいセクションを編集していることがわかります。
  • Augeasはべき等です。変更が必要な場合にのみ、ファイルを変更します。すべての値がすでに設定されている場合、ファイルは変更されません。
  • AugeasにはPuppetプロバイダーがあるため、これをPuppetインフラストラクチャで簡単に自動化できます。
  • パラメータがまだ存在しない場合、Augeasが作成します。セクションがまだ存在しない場合、Augeasは適切な構文でセクションを作成します。
12
ℝaphink

プログラムで設定ファイルを変更するためのツール Augeas もチェックアウトすることをお勧めします。 Puppet (構成管理システム)と組み合わせると非常に強力ですが、単独で使用することもできます。

2
ptman