shell脚本执行命令多次从输入文件

时间:2016-04-28 03:01:16

标签: bash shell

我有一个输入文件input.txt,我想运行一个命令,该命令应该从input.txt中读取两个值。让我们假设应该从输入和相同的命令中读取源名称和目标名称,以便根据input.txt重复数千次。

此外,每个命令的输出都将存储在单独的日志中。这可能是单个输入文件,还是我们需要使用2个文件作为源和目标?请求您提供用于实现此目的的shell脚本,因为我在shell脚本中很差。我尝试了以下无法正常工作。

while read i j; do
  command $i $j
done > output.txt

2 个答案:

答案 0 :(得分:1)

不确定。假设这是input.txt

source1.txt dest1.txt
source2.txt dest2.txt
...

你想这样做:

command source1.txt dest1.txt
command source2.txt dest2.txt
...

这是一种方式:

while read i o; do
    command $i $o
done < input.txt

这假设已经构造了命令command以从其第一个参数读取并写入其第二个参数。如果command打印到stdout(即终端屏幕),则将command $i $o替换为command $i > $o。这也假设input.txt中没有空格或有趣的字符。

如果您的input.txt有例如{...}},那么还有一种方法会明显加快数百万行或更多:

awk '{printf "command %s\n", $0}' input.txt | sh

或者,如果您必须使用command $i > $o

awk '{printf "command %s > %s\n", $1, $2}' input.txt | sh

此方法从input.txt读取行并为第一行打印command source1.txt dest1.txt,为第二行打印command source2.txt dest2.txt等等......然后它“管道”(|)这些命令to sh,执行它们。

对于command中的错误处理,请尝试:

while read i o; do
    command $i $o || command2 $i $o >> command2.log
done < input.txt 2> error.log

或者:

done < input.txt > error.log 2>&1

(其中一个会更好,取决于commandcommand2是否将错误打印到stdout(1)或stderr(2)。)

答案 1 :(得分:0)

假设您希望在不同文件中使用不同的输出,然后在每个命令的日志文件和每个命令的一个错误文件中使用:

while read i o; do
  command $i $o 2>"$i$o.err" >"$i$o.log"
done < input.txt

错误并登录同一文件:由于stderrstdout被重定向到2>&1

while read i o; do
  command $i $o 2>&1 >"$i$o.log"
done < input.txt

您也可以将所有文件放在同一个文件output.log中:

echo "" > output.log
while read i o; do
  command $i $o 2>&1 >> output.log
done < input.txt