将行重定向到shell中for循环下的不同文件

时间:2013-10-03 05:54:20

标签: shell redirect for-loop append

我想将某些行放入shell脚本中的两个不同文件中。我该怎么做这个的语法。

示例:

for循环打印6行,我希望前两行应该附加到第一个文件,最后4行应该附加到另一个文件。

2 个答案:

答案 0 :(得分:0)

  

for循环打印6行,我希望前两行应该   被附加到第一个文件,最后4行应该附加到   另一个文件。

没有办法。一种选择是将所有内容重定向到文件,然后将日志的所需部分复制到其他文件。

for i in {1..6}; do
  echo $i > log
done

head -4 log >> logfile1  # Appends the first four lines to logfile1
tail -2 log >> logfile2  # Appends the last two lines to logfile2

答案 1 :(得分:0)

答案

如果您正在使用BASH,则可以使用tee使用process substitution的组合同时向head -n2tail -n4发送相同的输入和管道:

$ for i in {1..6}; do echo $i; done | tee >(head -n2 >first2.txt) | tail -n4 >last4.txt
$ cat first2.txt
1
2
$ cat last4.txt
3
4
5
6

解释

默认情况下,tee获取其STDIN并将其复制到指定为参数的文件以及STDOUT。由于进程替换返回/dev/fd路径到文件描述符(echo >(true)以查看示例),tee能够像任何其他常规文件一样写入该路径。

这里是替换后tee命令的样子:

tee /dev/fd/xx | tail -n4 >last4.txt

或者更直观地说:

tee | tail -n4 >last4.txt
 :
 /dev/fd/xx
 :
 :..>(head -n2 >first2.txt)

因此输出被复制到head进程(其输出被重定向到first2.txt)和输出到tail进程的STDIN:

请注意,进程替换是BASH主义,因此如果您使用不同的shell或关注POSIX合规性,则可能无法使用。