![如何在 for 循环中分割行并用作命令行调用的参数](https://linux22.com/image/193552/%E5%A6%82%E4%BD%95%E5%9C%A8%20for%20%E5%BE%AA%E7%8E%AF%E4%B8%AD%E5%88%86%E5%89%B2%E8%A1%8C%E5%B9%B6%E7%94%A8%E4%BD%9C%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%B0%83%E7%94%A8%E7%9A%84%E5%8F%82%E6%95%B0.png)
我有一个看似非常简单的问题,但我无法提出令人满意的解决方案。我有一个包含 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
-P
nc
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。[...]