有没有办法在发送到文件之前处理tee中的文本?
例如,如果程序输出以下行:
stack 11
stack 22
stack 33
serverfault
serverfault
stack 44
如何只将包含“stack”的行发送到文件,同时仍然通过stdout显示程序的原始输出?
我不确定是否可以使用T恤进行此操作,所以我愿意接受任何其他建议。
由于
答案 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