forループで行を分割し、コマンドライン呼び出しの引数として使用する方法

forループで行を分割し、コマンドライン呼び出しの引数として使用する方法

非常に簡単に見える問題がありますが、満足のいく解決策が見つかりません。次のように、IPとポートを含む単純な入力ファイルがあります。

10.155.78.0 445
172.17.11.0 3389

nc -vvv <ip> <port>ここでforループの各行を実行したいと思います。

私が考えることができるのは、cutを使用して線を2回分割することだけです。

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

の目的は、Junk2番目のフィールド以降のすべてのフィールド(例:説明)を受信することです。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です。 [...]

関連情報