bash를 사용하여 csv 파일을 구문 분석하는 방법

IP 주소와 열린 포트가있는 CSV 파일이 있습니다.

IP,1,3,4,6,7,9,13,17,19,20,21,22,23,24,25,26 1.1.1.2,,,,,,,,,,,open,,,,, 1.1.1.3,,,,,,,,,,,open,,,,, 1.1.1.4,,open ,open,,,,,,,,open,,,,, 1.1.1.5,,,,,,,,,,,open,,,,, 1.2.3.4,,,,,,,,,,,open,,,,, 1.4.5.6,,,,,open,,,,,,open,,,,, 1.4.5.6,,,,,,,,,,,open,,,,, 1.1.3.4,,,,,,,,,,,open,,,,, 

개방 포트가있는 각 IP 주소에 대해 IP 주소와 열린 포트의 포트 번호 (CSV 헤더에서 가져옴)를 모두 사용하여 명령을 실행해야합니다.

Comments

  • 개방 된 포트가있는 각 IP에 대해 실행하는 명령이 해당 포트 번호를 사용해야합니까? 포트 번호가 CSV 헤더에 나열된 번호입니까?
  • @Kusalananda 정확히 !!
  • 제 질문 @Kusalananda를 수정하는 데 도움을 주셔서 감사합니다. 제 질문을 이해하셨습니다.
  • '이 특정 질문을 전달하겠습니다. 감사합니다. 하지만 제가 대답한다면 ' 어떤 명령을 실행 중인지 알고 싶습니다. 그러면 '가 포트 묘사되어야합니다. ' 답변이 더 유용하다고 생각합니다. ' 또한 가능한 포트 수가 26 개로 끝나거나 65,535 개까지 늘어날 수 있는지 궁금합니다. 또한 열린 항구는 하나 만 있을까요? 0 개 또는 2 개 이상이있을 수 있습니까?
  • @JeffSchaller 명령은 텔넷이고 포트 번호는 최대 65,535 개가 아니지만 900 개 이상의 포트를 가지고 있으며 스캔 할 때마다 상태가 변경됩니다. 내가 원하는 것은 수신 대기중인 활성 텔넷 세션이 있는지 확인하는 것이지만 열려있는 IP와 포트 번호를 선택하는 데 도움이 필요합니다.

답변

순수한 bash 완벽하게 해결하는 것은 바람직하지 않을 것입니다. 예를 들어 “ 왜 나쁜 습관으로 간주되는 텍스트를 처리하기 위해 쉘 루프를 사용합니까? “라는 질문입니다.

대신 입력 데이터를 만들어 보겠습니다. 좀 더 쉽게 이해할 수 있습니다.

awk "FNR == 1 { split($0, port, ","); FS=","; next } { for (i=2; i<=NF; ++i) if ($i == "open") print $1, port[i] }" file.csv 

awk 명령은 먼저 첫 번째 줄에서 포트 번호를 읽습니다. CSV 파일을 port라는 배열에 저장합니다. N 열의 포트 번호는 port[N].

입력의 첫 번째 줄을 쉼표로 분할하고 결과를 port 배열에 저장하는 방식으로 수행됩니다. div id = “0d125723a9″>

명령이 실행됩니다. 조건 FNR == 1는 “파일의 첫 번째 줄이면 다음을 수행합니다 …”(FNR는 현재 입력 파일의 줄 번호입니다.) 조건이없는 코드 블록은 각 입력 줄에 대해 실행됩니다.

, 는 쉼표로 설정됩니다. 즉, 파일의 다른 줄이 쉼표로 필드로 자동 분할됩니다. 이것은 두 번째 블록의 루프에서 각 행의 CSV 필드 (두 번째 필드에서 마지막 필드까지)를 반복하는 데 사용됩니다.

데이터의 다른 각 행에 대해 쉼표로 구분 된 필드를 반복하고 값이 문자열 open 인 필드를 찾으면, IP 주소 (첫 번째 필드)와 해당 포트 번호를 인쇄합니다.

질문의 데이터가 주어지면이 명령의 출력은 다음과 같습니다.

1.1.1.2 21 1.1.1.3 21 1.1.1.4 4 1.1.1.4 21 1.1.1.5 21 1.2.3.4 21 1.4.5.6 7 1.4.5.6 21 1.4.5.6 21 1.1.3.4 21 

셸의 루프에서 쉽게 읽을 수 있습니다.

while read -r ip port; do telnet "$ip" "$port" # or whatever your command is done 

이것은 IP 주소와 포트 번호를 하나씩 읽습니다.

이를 완전한 스크립트로 결합하려면 :

#!/bin/sh awk "FNR == 1 { split($0, port, ","); FS=","; next } { for (i=2; i<=NF; ++i) if ($i == "open") print $1, port[i] }" file.csv | while read -r ip port; do telnet "$ip" "$port" # or whatever your command is done 

awk의 출력 명령은 값을 읽고 명령을 호출하는 while 루프로 파이프됩니다 (입력 파일 이름 뒤에 | 파이프가 있음).

p>

IP 주소에 둘 이상의 포트가 열려있는 경우 해당 주소에 대해 명령이 여러 번 실행됩니다.

설명

  • OMG 이것은 내가 tr이었다 하려고, 이것은 놀랍습니다. I am dumb 좀 더 이해하도록 도와 주 시겠어요? (디버깅 모드에서 말씀해 주 시겠어요?)
  • @biniyamgetu 제가 무엇을 설명해야하는지 정확히 알아야합니다.
  • Bro I 정말 고마워요, 이건 정말 도움이 돼요 … 그래서 FNR == 1이 뭘하고 있고, 스플릿과 FS가 무엇인지 봅니다
  • @biniyamgetu 잠깐만 요, 그런 것들에 대한 추가 텍스트를 추가하겠습니다 .
  • 당신은 천재이고 제가하고 싶은 일을하고 있습니다 … 감사합니다 !!

답변

awk를 사용하여 첫 번째 및 다음 각 필드를 선택합니다.

awk -d "," -F "{print $1, $n...} 

주석

  • 아직 명령을 실행하거나 포트를 사용하는 주소는 ' 없습니다. 앞으로 질문에 많은 주석 및 수정 작업이 진행될 때 ' 요건이 해결 될 때까지 기다렸다가 답변을 시도 할 것을 제안합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다