2014-09-26 79 views
0

我花了很多时间来得到这个运行:输出重定向到多张文件与发球和grep

从脚本STDOUT + STDERR toLogfile 1和grep的输出重定向到日志文件2

第一日志文件应该包含完整的输出,而第二个日志文件只包含开始和结束行(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完整

(脚本是经由外壳脚本的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到grep此.log

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

我认为问题是格式,时间戳,whitespac ES。 我认为grep'word'会把这两条线都吸引住我,但事实并非如此。 愚蠢的。

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

没有工作,log1中确定,在shell mysrctips.log空

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

效果很好。但所有它没有组合。

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

+1

你grepping不同的单词,一旦'开始'下次'开始' - 所以,你想要什么grep? – jm666 2014-09-26 18:28:21

+0

'开始|结束'是文本模式。我喜欢grep“启动脚本”和“Fin脚本”。 – Memphis01 2014-09-26 18:30:48

+0

我尝试了sysntax,发生了同样的情况。但知道我认为这个问题是另一回事。 – Memphis01 2014-09-26 18:40:59

回答

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 
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使用>>
  • egrep已经过时 - 因此最好使用grep -E

而且,代替grep可以使用sed过,像:

sed -nE '/(start script|fin Main-Job)/p'