쉼표로 구분된 파일에서 값 가져오기

쉼표로 구분된 파일에서 값 가져오기

다음과 같은 구조의 파일이 있습니다.

[IP ADRESS], [ID-Number], [Name]
[IP ADRESS], [ID-Number], [Name]
[IP ADRESS], [ID-Number], [Name]
...

(괄호 안은 실제 값)

행을 반복하는 동안 특정 값(IP 주소, ID 또는 이름)을 어떻게 얻을(인쇄) 수 있습니까? (이미 작업을 시작했으므로 "sed"를 사용하는 것이 좋습니다)

내 목표는 스크립트를 사용하여 각 서버에 SSH 명령을 보내 IP 주소를 얻은 다음 이름과 결합된 각 명령의 출력을 표시하는 다른 프로그램의 ID 번호와 이름을 얻는 것입니다. 모니터링 서비스). 따라서 해당 값 중 한두 개만 얻을 수 있으면 됩니다.

답변1

awk아마도 작업을 위한 가장 간단한 도구일 것입니다.

예제 입력 파일( 라고 함 foo)에서 볼 수 있듯이 줄의 마지막 필드를 제외한 모든 필드에는 쉼표와 공백이 있습니다.

따라서 각 줄의 IP 주소를 인쇄하려면 다음을 사용하십시오.

$ awk -F', ' '{print $1}' < foo

각 행의 ID 번호를 인쇄하려면 다음을 사용하십시오.

$ awk -F', ' '{print $2}' < foo

각 행의 이름을 인쇄하려면 다음을 사용하십시오.

$ awk -F', ' '{print $3}' < foo

awk다양한 입력 필드를 결합하는 출력을 생성하기 위해 별도의 문을 만들 수도 있습니다 .

$ awk -F', ' '{print "ssh " $1 " /path/to/myscript.sh " $2 " " $3}' < foo

명령문의 출력을 검사하여 목적에 맞게 정확하고 유효한지 확인한 후에는 이를 셸에 파이프하여 쉽게 실행할 수 있습니다.

$ awk -F', ' '{print "ssh " $1 " /path/to/myscript.sh " $2 " " $3}' < foo | bash

답변2

최근 업데이트를 기반으로 답변을 추가하세요. SSH를 통해 각 서버에 연결하고 ID 및 이름 값을 사용하여 하나 이상의 명령을 실행하세요.

다음과 같은 샘플 파일로 시작하세요.

$ cat testfile.txt
192.168.56.1,12345,N1
192.168.56.2,23456,N2
192.168.56.3,34567,N3

루프 whileread작업을 수행할 수 있습니다.

while IFS=, read -r IP ID NAME; do 
    echo "ssh $IP myprogram $ID $NAME"
done < testfile.txt

출력은 다음과 같습니다.

ssh 192.168.56.1 myprogram 12345 N1
ssh 192.168.56.2 myprogram 23456 N2
ssh 192.168.56.3 myprogram 34567 N3

루프는 다음과 같이 작동합니다. 입력 파일에서 각 줄을 순서대로 읽습니다. 각 줄의 내용은 특수 변수에 따라 여러 필드로 구분됩니다 IFS. 설정을 사용하면 IFS=,"," 문자가 나타날 때마다 줄을 분할할 수 있습니다. 이렇게 하면 각 행이 세 개의 필드로 분할됩니다.

완료되면 각 필드 가 해당 변수 & 에 할당 IP됩니다 ID. NAME루프 본문 내에서 이러한 변수를 사용할 수 있습니다. 예를 들어, ssh각 줄에 가능한 명령을 인쇄해 보겠습니다 .

참고로 제가 예시로 사용한 CSV 파일은 단순 파일입니다. 더 복잡한 CSV 파일이 있는 경우 csvkit.

답변3

밀러 사용(https://github.com/johnkerl/miller/releases/tag/5.4.0), 다음부터 시작

169.38.84.49,8695458,Malcolm
23.246.195.8,7589632,Jerry
119.81.134.226,4571286,Basil

두 번째 필드가 7589632와 같은 행을 원하는 경우

mlr --nidx --fs "," filter -S '$2=="7589632"' input.csv

두 번째 필드가 7589632인 행의 첫 번째 열만 원하는 경우

mlr --nidx --fs "," filter -S '$2=="7589632"' then cut -f 1 input.csv

답변4

나는 Haxiel의 솔루션을 좋아하고 뭔가를 추가합니다 ...

  while IFS=, read -r IP ID NAME; do 
      echo "ssh $IP myprogram $ID $NAME"
  done << ENDEND     
  192.168.56.1,12345,N1
  192.168.56.2,23456,N2
  192.168.56.3,34567,N3
  ENDEND

관련 정보