我运行一些生成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/
请帮忙吗?
答案 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
运行命令
Pipe to tee
启用追加模式
两次附加到同一文件
答案 2 :(得分:0)
生成一些临时输出,然后将临时复制到目标并删除临时:
some command > /tmp/out.txt; cat /tmp/out.txt /tmp/out.txt > out.txt; rm /tmp/out.txt
答案 3 :(得分:0)
以下是您可以使用的更多选项。如果输出太大而无法存储在变量中,我可能会使用临时文件tee
和gzip
,如果磁盘写入速度是瓶颈的话。
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
不确定是否可以安全地执行此操作而无需使用临时文件。你可以将它捕获到一个变量,正如一些人所建议的那样,但你必须小心引用然后确保空格不会被破坏,如果输出特别大,你也可能会遇到问题。