使用tee和grep将输出重定向到多个文件

时间:2014-09-26 18:13:19

标签: shell logging grep tee

我花了很多时间才能让它运行起来:

将输出从脚本STDOUT + STDERR重定向到Logfile 1,将grep重定向到Logfile 2

第一个日志文件应该包含完整的输出,第二个日志文件只包含Start和End-Lines(grep)。

我尝试了不同的语法,但没有任何作用。

./run.sh 2>&1 | tee -a /var/log/log1.log | (grep 'START|END') > /var/log/myscripts.log

./run.sh 2>&1 | tee -a /var/log/log1.log | grep 'Start' > /var/log/myscripts.log

./run.sh 2>&1 | tee -a /var/log/log1.log | egrep 'Start' > /var/log/myscripts.log

./run.sh 2>&1 | tee -a /var/log/log1.log | grep -E 'Start' > /var/log/myscripts.log

输出将仅重定向到第一个日志。第二个日志是空的。

我不知道为什么;你有什么想法吗?

示例 - 输出行

这应该在log1.log

中完成

(脚本是通过shell脚本的java startet)

26.09.2014 20:38:51 |       start script > load_stats.sh
26.09.2014 20:38:51 | [DB DATA]         
26.09.2014 20:38:51 |               Host > locahost
26.09.2014 20:38:51 |               User > leroy

... more ...

26.09.2014 20:39:23 |         fin script > load_stats.sh

我想在myscripts.log

中使用grep
26.09.2014 20:38:51 |       start script > load_stats.sh
26.09.2014 20:39:23 |         fin script > load_stats.sh

我认为问题是格式,时间戳,空格。 我认为grep'word'会抓住这两条线,但事实并非如此。 笨

./run.sh 2>&1 | tee -a /var/log/log1.log | sed -nE '/(start script|end script)/p' >> /var/log/myscripts.log

无效,log1 ok,mysrctips.log为空

tail -f -n 500 /var/log/log1.log | sed -nE '/(start script|end script)/p'

在shell中运行良好。但结合所有它没有。

执行脚本>重定向到日志1>重定向和过滤(grep,egrep,sed,..)到log 2

2 个答案:

答案 0 :(得分:0)

这对我来说很好用:

$ cat <<_DATA | tee out1 | grep -E 'START|END' > out2
hello 
START1
foo
END2
bar
_DATA
$ cat out1
hello 
START1
foo
END2
bar
$ cat out2
START1
END2

答案 1 :(得分:0)

这应该有效

./run_test.sh 2>&1 | tee -a /var/log/log1.log | grep -E 'start script|fin Main-Job' > /var/log/myscripts.log
#                        ^^ append              ^^^^^^^ - same as egrep             ^overwrite/create

打印

26.09.2014 20:38:51 |       start script > load_stats.sh
26.09.2014 20:39:23 |       fin Main-Job > load_stats.sh

如果想要

  • 覆盖/创建log1 - 删除-a
  • 附加到myscripts.log使用>>
  • {@ 1}}已弃用 - 因此最好使用egrep

此外,您也可以使用grep -E代替grep,例如:

sed