如何在发送到文件之前“处理”tee中的文本

时间:2014-04-12 02:23:30

标签: bash shell debian

有没有办法在发送到文件之前处理tee中的文本?

例如,如果程序输出以下行:

stack 11
stack 22
stack 33
serverfault
serverfault
stack 44

如何只将包含“stack”的行发送到文件,同时仍然通过stdout显示程序的原始输出?

我不确定是否可以使用T恤进行此操作,所以我愿意接受任何其他建议。

由于

3 个答案:

答案 0 :(得分:6)

要在终端上显示myprogram的完整输出,同时将过滤后的输出保存到文件中:

myprogram | tee /dev/tty | grep stack >out

如果您不想将完整输出发送到终端,而是想用其他内容处理它,比如说someotherprogram,那么我们可以使用bash的进程替换:

myprogram | tee >(grep stack >out) | someotherprogram

someotherprogram在其stdin上收到myprogram的完整输出,而只有过滤后的输出保存在out中。

答案 1 :(得分:0)

这不使用T恤,但它会做你想做的一切

#!/bin/bash

cat |
while read line ; do 
    echo $line
    echo $line |grep stack >> outfile.txt
done

答案 2 :(得分:0)

与Keith的答案相似,但并不依赖于任何外部工具(当然,除了T恤)

AirBoxOmega:~ d$ man tee|cat > stackHelp.file
AirBoxOmega:~ d$ wc -l stackHelp.file
      33 stackHelp.file
AirBoxOmega:~ d$ cat stackHelp.file|while read i;do if [[ $i =~ "file" ]];then echo "$i"|tee -a stackHelp.out;else echo "$i";fi;done|wc -l
      33
AirBoxOmega:~ d$ grep file stackHelp.out
in zero or more files.  The output is unbuffered.
-a      Append the output to the files rather than overwriting them.
file  A pathname of an output file.
AirBoxOmega:~ d$

您可以在任何命令之后放置while循环,然后只使用您要查找的任何关键字。在我的示例中,我使用了tee联机帮助页中的文本。

这里的代码很漂亮,虽然它相对简单(是的,它是一只无用的猫,但是它证明了while循环可以读取命令的输出不只是从文件中读入)。

cat stackHelp.file | while read i; do
    if [[ $i =~ "file" ]]; then
        echo "$i" | tee -a stackHelp.out;
    else
        echo "$i";
    fi;
done