如何在 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 并启动子 shell

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是接收第二个字段之后的任何字段(例如,评论)。我们inFile在 fd 3 而不是 stdin 上打开,否则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。[...]

相关内容