如何将命令的输出两次写入文件

时间:2016-05-13 18:26:33

标签: linux shell unix

我运行一些生成ip地址作为输出的命令。但我正在开发一个工作流程,我需要将IP地址写入两次。下面是示例命令及其输出。

$ some command >> out.txt

$ cat out.txt
10.241.1.85
hdfs://10.241.1.236/
hdfs://10.241.1.237/

我想要的是复制输出,它应该是这样的。

10.241.1.85
hdfs://10.241.1.236/
hdfs://10.241.1.237/
10.241.1.85
hdfs://10.241.1.236/
hdfs://10.241.1.237/

请帮忙吗?

5 个答案:

答案 0 :(得分:1)

@ott在评论中给出的解决方案似乎很好:

 var=$(some cmd); echo -e "$var\n$var".

这不是指定varable的命令,而是将命令的输出分配给变量。

当你不想要这个时,你可以使用tee(也许这会产生一些排序问题)或者以不同的方式复制它:

some_command > out.txt.tmp
cat out.txt.tmp out.txt.tmp > out.txt
rm out.txt.tmp

这样,您首先在第一个条目的行之后获取副本的行。如果要直接将输出加倍,可以使用

some_command | sed 'p' > out.txt

答案 1 :(得分:0)

some command | tee -a out.txt out.txt

或者

some command | tee -a out.txt >> out.txt

或者

some command | tee -a out.txt out.txt >/dev/null
  1. 运行命令

  2. Pipe to tee

  3. 启用追加模式

  4. 两次附加到同一文件

答案 2 :(得分:0)

生成一些临时输出,然后将临时复制到目标并删除临时:

some command > /tmp/out.txt; cat /tmp/out.txt /tmp/out.txt > out.txt; rm /tmp/out.txt

答案 3 :(得分:0)

以下是您可以使用的更多选项。如果输出太大而无法存储在变量中,我可能会使用临时文件teegzip,如果磁盘写入速度是瓶颈的话。

someCommand > tmp.txt && cat tmp.txt tmp.txt > out.txt && rm tmp.txt

现在,如果磁盘读/写速度是瓶颈,您可以通过gzip初始化someCommand的输出并重定向其中一个管道。

someCommand | tee >(gzip > tmp.gz) > out.txt && gunzip -c tmp.gz >> out.txt && rm tmp.gz

此外,如果您不需要out.txt的随机访问权限并计划通过其他管道处理它,您可以随时保存它直到您需要它。

someCommand | gzip > tmp.gz && cat tmp.gz tmp.gz > out.txt.gz && rm tmp.gz

答案 4 :(得分:0)

我会建议:

(someCommand | tee tmp.txt; cat tmp.txt) > out.txt; rm tmp.txt

不确定是否可以安全地执行此操作而无需使用临时文件。你可以将它捕获到一个变量,正如一些人所建议的那样,但你必须小心引用然后确保空格不会被破坏,如果输出特别大,你也可能会遇到问题。