web-dev-qa-db-ja.com

テキストファイルの行を個別の引数としてコマンドに渡しますか?

こんにちは、複数行のfile.txtをbashスクリプトの引数に単純に渡してコマンドとして実行する方法を理解しようとしています。 whileループを実行する必要があるかわかりませんか?

したがって、テキストファイルには約のようなものが含まれています。

ip_addr1,foo:bar
ip_addr2,foo2:bar2
user@ip_addr3,foo3:bar3

そして、私はただbashスクリプトがそのファイルからコンテンツを取得して、次のような例としてbashスクリプトとして使用することを望んでいます

ssh ip_addr1 'echo "foo:bar" > /root/text.txt' 
ssh ip_addr2 'echo "foo2:bar2" > /root/text.txt'
ssh user@ip_addr3 'echo "foo3:bar3" > /root/text.txt'  

したがって、スクリプトはテキストファイルの行数に応じて実行されます。

2
Ryan

this question への回答から示唆されているように、bash readコマンドを使用してファイルの行を繰り返すことができます。

while read -r line
do
  # $line will be a variable which contains one line of the input file
done < your_file.txt

thisへの回答で示唆されているように、read変数でIFSを再度使用して、IFS変数で分割された各行からコンテンツを取得できます。質問

while read -r line
do
  # $line will be a variable which contains one line of the input file
  IFS=, read -r ip_addr data <<< "$line"
  # now, $ip_addr stores the stuff to the left of the comma, and $data stores the stuff to the right
done < your_file.txt

そこから、新しい変数を使用して実行するコマンドを実行できます。

while read -r line
do
  # $line will be a variable which contains one line of the input file
  IFS=, read -r ip_addr data <<< "$line"
  # now, $ip_addr stores the stuff to the left of the comma, and $data stores the stuff to the right
  ssh "$ip_addr" "echo \"${data}\" >  /root/text.txt"
done < your_file.txt

$line変数が必要ない場合は、単一のreadコマンドを使用できます。

while IFS=, read -r ip_addr data
do
  # now, $ip_addr stores the stuff to the left of the comma, and $data stores the stuff to the right
  ssh "$ip_addr" "echo \"${data}\" >  /root/text.txt"
done < your_file.txt
1
rchome

sedを使用して、入力ファイルをシェルスクリプトに変換します。

$ sed -e "s|\([^,]*\),\(.*\)|ssh -n \"\1\" 'echo \"\2\" >/root/text.txt'|" file
ssh -n "ip_addr1" 'echo "foo:bar" >/root/text.txt'
ssh -n "ip_addr2" 'echo "foo2:bar2" >/root/text.txt'
ssh -n "user@ip_addr3" 'echo "foo3:bar3" >/root/text.txt'

またはawk

$ awk -F ',' '{ printf("ssh -n \"%s\" '\''echo \"%s\" >/root/text.txt'\''\n", $1, $2) }' file
ssh -n "ip_addr1" 'echo "foo:bar" >/root/text.txt'
ssh -n "ip_addr2" 'echo "foo2:bar2" >/root/text.txt'
ssh -n "user@ip_addr3" 'echo "foo3:bar3" >/root/text.txt'

次に、リダイレクトを使用してこれらのいずれかの出力をファイルに保存し、shで実行します。これにより、実行されたコマンドを正確に記録できます。

または、次のコマンドでどちらかのコマンドの出力を実行することもできます

...either command above... | sh -s
0
Kusalananda