텍스트 파일 행을 구분된 인수로 명령에 전달하시겠습니까?

텍스트 파일 행을 구분된 인수로 명령에 전달하시겠습니까?

안녕하세요, 저는 여러 줄이 포함된 file.txt를 bash 스크립트 인수에 전달하여 명령으로 실행하는 방법을 알아내려고 노력해 왔습니다. while 루프를 수행해야 할지 잘 모르겠나요?

따라서 텍스트 파일에는 about과 같은 내용만 포함됩니다.

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'  

따라서 텍스트 파일의 행 수에 따라 스크립트가 실행됩니다.

답변1

read답변에서 제안한 대로 bash 명령을 사용하여 파일 행을 반복할 수 있습니다.이 문제.

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

답변에서 알 수 있듯이 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

답변2

다음 명령을 사용하여 입력 파일을 쉘 스크립트로 변환하십시오.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

관련 정보