ファイル.txt
servername1:DBNAME1:/u01/app
servername2:DBNAME2:/u01/dbs
servername3:DBNAME3:/u01/app1
上記のファイルの内容を1行ずつ使用してシェルスクリプトで実行したい
command1 hostname=servername1 db=dbanme1 location=/u01/app
command2 hostname=servername1 db=dbanme1 location=/u01/app
上記のコマンドの後、2番目の行の値を取得して実行する必要があります。
答え1
while IFS=':' read -r hostname db location
do
set -- hostname="$hostname" db="$db" location="$location"
command1 "$@"
command2 "$@"
done <file.txt
または、位置パラメータを保存する必要がある場合
while IFS=':' read -r hostname db location
do
command1 hostname="$hostname" db="$db" location="$location"
command2 hostname="$hostname" db="$db" location="$location"
done <file.txt
どちらもfile.txt
1行ずつ読み取られ、各行に分かれた3つのフィールドが3つの変数と:
読み込まれます。行にさらに - で区切られたフィールドがある場合、そのフィールドは値に追加されます。hostname
db
location
:
location
その後、コマンドを実行します。
答え2
使用GNUパラレル:
$ parallel --colsep ":" 'command1 hostname={1} db={2} location={3}; command2 hostname={1} db={2} location={3}' :::: file.txt
file.txt
コマンドのすべての行に対して実行されます。 、、、が列の値に置き換えられるように、行が分割され:
ます。{1}
{2}
{3}
プロセスはparallel
並列に開始されます。デフォルトでは、並列に実行されるジョブの数はコア数です。並列に実行できるジョブの数を指定できます-j
。-k
行が実行された順序で出力を維持する必要がある場合は、このパラメーターを使用してください。