我想将某些行放入 shell 脚本中的两个不同文件中。我应该如何把这个语法。
例子:
一个 for 循环打印 6 行,我希望前两行应该附加到第一个文件,最后 4 行应该附加到另一个文件。
一个 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
如果您使用的是 BASH,您可以使用进程替换和管道的组合同时tee
向两者发送相同的输入:head -n2
tail -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 合规性,它可能不可用。