连接标准输出和文件中的内容

连接标准输出和文件中的内容

我们如何将 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共享。什么时候写一份副本catlsgrepcatfile2.txt到相同的共享标准输出。通常,这样可以减少管道数量。

... 或者 ...

ls -a | sed -ne'$r file2.txt' -e'/text1/p' >outfile

这里sed代表grep并通过仅打印匹配的内容来过滤输入到输出text1正则表达式。当它到达$最后一个ls输出时,它会安排在完全完成当前行周期后r进行file2.txt输出 - 因此一旦打印(或不打印)的输出的最后一行,它也ls将所有内容复制到其标准输出。file2.txt

相关内容