我们如何将 stdout(或 stderr)和文件的结果连接到最终文件中。
例如
ls -a | grep text1
将 与 连接成file2.txt
最终结果(不是file2.txt
),而不存储grep text1
到中间内容,例如grep text1 > file1.txt
答案1
ls -a | grep text1 | cat file2.txt -
代表-
标准输入。或者你可以写
ls -a | grep text1 | cat - file2.txt
以不同的顺序输出。
使用进程替换的另一种可能性:
cat <(ls -a | grep text1) file2.txt
或以不同的顺序:
cat file2.txt <(ls -a | grep text1)
答案2
{}
您可以使用或将命令组合在一起()
并重定向它们的组合输出:
{
cat file1.txt
echo "Now the ls/grep"
ls -a |grep foobar
} > file2.txt
作为单行者:
{ cat file1.txt; echo "Now the ls/grep"; ls -a |grep foobar; } >file2.txt
最后一点;
是必要的。
答案3
file2.txt
您可以通过执行以下操作将其附加到末尾
ls -a | grep text1 >> file2.txt
或者如果您想将其放在不同的文件中
ls -a | grep text1 > output.txt
cat file2.txt >> output.txt
如果您想要 stderr 而不是 stdout
ls -a | grep text1 2>> output.txt
请注意,这可能不会在您的文件中放入任何内容,因为ls -a
不太可能向 stderr 输出任何内容。
编辑:如果您想将结果通过管道传输到另一个程序而不是重定向到文件,您可能需要使用命名管道。
mkfifo pipe1
cat pipe1 | next program &
ls -a | grep text1 >> pipe1
cat file2.txt >> pipe1
答案4
ls -a | { grep text1; cat file2.txt; } >outfile
这里ls
写入写入到标准输出,它与通过过滤输出时启动的进程grep
共享。什么时候写一份副本cat
ls
grep
cat
file2.txt
到相同的共享标准输出。通常,这样可以减少管道数量。
... 或者 ...
ls -a | sed -ne'$r file2.txt' -e'/text1/p' >outfile
这里sed
代表grep
并通过仅打印匹配的内容来过滤输入到输出text1
正则表达式。当它到达$
最后一个ls
输出时,它会安排在完全完成当前行周期后r
进行file2.txt
输出 - 因此一旦打印(或不打印)的输出的最后一行,它也ls
将所有内容复制到其标准输出。file2.txt