使用sed过滤管道

时间:2015-02-23 04:32:18

标签: linux sed pipe

我如何

  1. 将管道输出发送至STDOUT 同时
  2. 过滤管道输出并将其写入文件
  3. 我试过

    cat file | tee | sed 's/abc/def/g' >> log.txt
    

    我在log.txt中获得了所需的过滤输出,但STDOUT没有任何内容发送到tee

2 个答案:

答案 0 :(得分:2)

如果目标是在将过滤后的文件发送到log.txt时查看终端上的完整文件,请尝试:

cat file | tee /dev/tty | sed 's/abc/def/g' >> log.txt

在这种情况下,tee会将输出发送到stdout,在这种情况下,它会转到sed,也会转到您的终端文件/dev/tty

或者,如果你有bash或其他高级shell:

cat file | tee >(sed 's/abc/def/g' >> log.txt)

这里,tee将输出发送到stdout,也发送到命令行中列出的文件。在上面,我们要求bash使用sed命令创建一个类文件对象。这是使用咒语>(...)完成的,也称为流程替换。无论哪个发球台写到那个"文件"将显示为sed的stdin,它将处理它并将其发送到log.txt。另外,tee将写入stdout,在这种情况下,与上面的第一个命令不同,它是终端。

(我假设您使用cat file替代更复杂的命令,而不是无用地使用cat。)

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed 's/abc/def/gw fileChanges' <fileIn >fileOut

这仅将更改写入fileChanges,将原始文件写入fileOut(如果不提供文件,则写入stdout)。