できるだけ簡単に説明するには、Linuxでbash / sed / awkと基本OSコマンドを使用して、以下に複数の文字列(サーバー名)を含むテキストファイルに複数のヘッダーを含むリストを作成しようとしています。その後、スクリプトを実行し、実行時にオプション/パラメータとして渡す特定のタイトルの下の各項目に対してさまざまなタスクを実行できるようにしたいです。
このテキストファイルの例:(この項目は単一の列の関連タイトルの下に配置する必要があります。このページではそのように表示することはできません。)
[main_server_list]
Jupiter
Saturn
Thisguy
Thatguy
BuffalO
randomspite
coffeebinge
[alternate_server_list]
Jupiter
Saturn
[Tertiary_server_list]
Thisguy
Thatguy
coffeebinge
[Enough_already]
BuffalO
randomspite
したがって、既定では、すべてのコンピュータのディレクトリにファイルをコピーするには、次の手順を実行します。
# bash maincopyscript.sh [main_server_list]
そして、「ループ」は、それをインストールするサーバーのリストが[main_server_list]ヘッダーの下のすべての項目であることを知っていますが、他のヘッダーの下の他のすべての項目は無視します。
同様に、私は次のこともできるようにしたいです。
# bash maincopyscript.sh [Tertiary_server_list]
同じ機能を期待しています。今回は、[Tertiary_server_list]ヘッダーの下のエントリに対してのみ「ループ」を実行してから完了します。
最後に、必要に応じて順序に関係なく複数のヘッダーを指定できることを願っています。たとえば、
# bash maincopyscript.sh [Enough_already] [alternate_server_list]
その後、これら2つのヘッダーの下のエントリに対してのみスクリプトで指定されたタスクを実行してから完了する必要があります。
基本的にbash / sed / awkを使ってこれを行う方法についてのアイデアを得たことを願っています。 (必要であれば他のツールを使用しても構いません)
はい、私はansible/puppet/chefがこれらの結果を得るのを助けることができることを知っています。しかし、とにかくこのようにしたい特別な理由があります。この問題に関する既存の投稿を検索するのに1〜2時間かかりましたが、見つからなかったので、ついに質問をすることにしました。どんな助けでも大変感謝します!
(ボーナス、タイトル、グループ自体をまったく同じ形式に保ちながら、各タイトルの下にアイテムをアルファベット順に並べる方法を誰かが私に示すことができればうれしいです!)
ベストアンサー1
awkを使用してヘッダーの下から名前を抽出して入れることができます。大量に 変える、そして繰り返し可能な配列を使用してくださいfor
。ここのスクリプトはコマンドラインからスキーマを取得します。
#!/bin/bash
patt=$1
if [ -z "$patt" ] ; then echo "need an argument" ; exit 1 ; fi
A=( $(awk '/^\[/ {p = 0};
/^\['"$patt"'\]/ {p=1; next}
p && !/^ *$/ ;' < servers ) )
for x in "${A[@]}" ; do
echo doing something with "$x"
done
だから、
$ bash for_all.sh alternate_server_list
doing something with Jupiter
doing something with Saturn
awk
プログラムで:
/^\[/ {p = 0}
- 開かれている括弧が行の最初の文字である場合は、pを0に設定します。
/^\['"$patt"'\]/ {p=1; next}
- パターンと一致した場合、pを1に設定し、次の行にジャンプします。パターンはシェル変数で awk に提供されるため、正規表現として扱われます。引用符は、コードの一部が一重引用符内にあり、変数が二重引用符内にあり、一重引用符内にさらに多くのコードがあるため、興味深いものです。似てい'foo' "$var" 'bar'
ますが、スペースはありません。
p && !/^ *$/
- pが設定されていて行が空でない場合(開始と終了の間にスペースのみがある)、それを印刷します(デフォルトの動作)。
ああ、そしてリスト項目に興味深い内容(スペースなど)が含まれていると、競合が発生して燃えてしまいます。