-2

我想将某些行放入 shell 脚本中的两个不同文件中。我应该如何把这个语法。

例子:

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

4

2 回答 2

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
于 2013-10-03T06:05:02.710 回答
0

回答

如果您使用的是 BASH,您可以使用进程替换和管道的组合同时tee向两者发送相同的输入: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,除了其 STDOUT 之外,还获取其 STDIN 并将其复制到指定为参数的文件。由于进程替换返回/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)和输出 STDIN,后者通过管道传输到tail进程:

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

于 2013-10-03T19:19:17.317 回答