for 루프에서 줄을 분할하고 명령줄 호출의 인수로 사용하는 방법

for 루프에서 줄을 분할하고 명령줄 호출의 인수로 사용하는 방법

매우 간단해 보이는 문제가 있지만 만족스러운 해결책을 찾을 수 없습니다. 다음과 같이 IP와 포트가 포함된 간단한 입력 파일이 있습니다.

10.155.78.0 445
172.17.11.0 3389

nc -vvv <ip> <port>이제 for 루프의 각 행을 실행 하고 싶습니다 .

내가 생각할 수 있는 것은 cut을 사용하여 선을 두 번 분할하는 것뿐입니다.

for x in $(cat inputfile); do nc -vvv $(echo -n $x | cut -d" " -f1) $(echo -n $x | cut -d" " -f2)

또는 gawk를 사용하고 서브쉘을 시작하십시오.

for x in $(cat dingens); do cmd=$(echo $x | gawk -F" " '{ print "nc -vvv -w 2 " $1 " " $2 }'); echo -n $cmd | bash; done

그러나 두 솔루션 모두 매우 복잡해 보입니다. 더 나은 해결책은 없을까요?

답변1

while IFS=" " read -r Ip Port Junk <&3; do
    nc -vvv "${Ip}" "${Port}" 3<&-
done 3< inFile

의 목적은 Junk두 번째 필드 이후의 모든 필드(예: 설명)를 수신하는 것입니다. inFilestdin 대신 fd 3에서 엽니다. 그렇지 않으면 해당 nc루프를 호출하면 다음 내용도 읽게 됩니다.inFile

답변2

예를 들어 다음과 같이 사용할 수 있습니다 xargs.

xargs -n 2 nc -vvv < inputfile

에서 man xargs:

-n max-args,--max-args=max-args

명령줄당 최대 max-args개의 인수를 사용합니다. [...]

xargs각 명령의 출력을 리디렉션하는 데 주의한다면 이 옵션을 사용하여 여러 명령을 병렬로 실행할 수도 있습니다 . 예를 들어, 8코어 CPU가 있고 8개의 작업을 병렬로 실행하려는 경우:nc-Pnc

xargs -P 8 -n 2 sh -c 'nc -vvv "$1" "$2" > "$1-$2.log"' sh < inputfile

-P max-procs,--max-procs=max-procs

max-procs한 번에 실행할 수 있는 최대 프로세스 수는 1입니다. [...]

관련 정보