bashスクリプトを介してファイルを編集する


12

私は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 to enable = 1
  2. テスト= "1"からテスト= "0"
  3. 行にテキストを追加します。functions = to function = "text1"、 "text2"
  4. ファイルにテキストを追加して保存します(nanoを使用)

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


ほとんどのbashスクリプトを正常に完了したすべての返信に感謝します

しかし、私は別の問題は、私たちはworker_processesに対処しますsedを使用してnginx.conf変更したいとしましょいる
使用は、以下の1.Findに行うためにsedを今私が欲しい最初に出現するworker_processes というのconf内としてテキストを置き換えますworker_processes 4;

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

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


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

また、 "Thanks Quanta"(quote)のようなsedのファイルの末尾に引用符付きのテキストを追加する必要があります。phpの場合は、引用符をエコーし​​て\を入力します。


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

listen =何かのように。、listen = /tmp/php5-fpm.sock;に変更します。

アップクォンタムに大賛成

素晴らしいサポートをありがとう

回答:


18
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を使用して次のことを行いたい1.そのconfでworker_processesの最初の出現を見つけ、worker_processes 4でテキストを置き換えます。

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=0したものです。しかし、私はそれがそのファイルのすべてを変更する可能性があると感じています。これはサーバーを破壊します。誰でもより良いコードを提案できますか?enabled=1[remi]remi.repoenabled=0

あなたのためにここに:

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

私が確信していないもう1つのこと:PIはこれをText Testing = "0"として持っているファイルを編集したい(はい、引用符があり、それを保持する必要があります) 1 "(引用符付き)

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

また、 "Thanks Quanta"(quote)のようなsedのファイルの末尾に引用符付きのテキストを追加する必要があります。phpの場合は、引用符をエコーし​​て\を入力します。

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

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

listen =何かのように。、listen = /tmp/php5-fpm.sock;に変更します。

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

'sedの'/ \優先= 10' /etc/yum.repos.d/epel.repoは'ファイルを編集し、changes.PLease確認を救う/ 1 =有効
Werulz

@Werulz:問題のないファイルを確認するか、epel.repoの内容をホームディレクトリ内のファイルにコピーし、root /スーパーユーザー権限なしで実行してみてください。
エリックI

-iはの標準オプションではありませんsededただし、sedに非常によく似た構文でファイルを編集する標準準拠の方法を提供します。
小次郎

最初の投稿を更新して、別の提案をお願いしました。これまでのサポートに感謝します。
ヴェルルズ

私は再び投稿を更新しました......非常に多くの質問をして申し訳ありません。必要な場合にスクリプトを共有します
ヴェルルズ

12

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 vs sed/ を使用することにはいくつかの利点がありますawk

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

返信をありがとう......確かにそれを考慮します....私のbashスクリプトでそれを使用する方法の例を与えることができます
-Werulz

わかりました、編集をご覧ください。
チャフィンク

2

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


それは何ですか
ヴェルルズ

2
Augeasとは何かを簡単に説明し、例を1つまたは2つ追加することで、この回答の品質を向上させることができます。
ThatGraemeGuy

新しい質問の男を追加しました
ヴェルルズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.