Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 使用tee和grep将输出重定向到多个文件_Shell_Logging_Grep_Tee - Fatal编程技术网

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

Shell 使用tee和grep将输出重定向到多个文件,shell,logging,grep,tee,Shell,Logging,Grep,Tee,我花了很多时间让它运行: 将脚本STDOUT+STDERR的输出重定向到日志文件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/l

我花了很多时间让它运行:

将脚本STDOUT+STDERR的输出重定向到日志文件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中完成

(该脚本是通过shell脚本实现的java startet)

我想在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
我认为问题在于格式、时间戳和空格。 我原以为格雷普的“单词”会抓住我这两行,但事实并非如此。 愚蠢的

不工作,日志1正常,mysrctips.log为空

tail -f -n 500 /var/log/log1.log | sed -nE '/(start script|end script)/p'
在外壳中工作良好。但综上所述,情况并非如此


执行脚本>重定向到日志1>重定向并过滤(grep、egrep、sed等)到日志2

这对我来说很好:

$ 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
$cat这应该行得通

./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
如果需要

  • 覆盖/创建日志1-删除
    -a
  • 附加到myscripts.log
使用
>
  • 不推荐使用
    egrep
    ,因此最好使用
    grep-E
  • 此外,您也可以使用
    sed
    来代替
    grep
    ,例如:

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

    你用灰色显示不同的单词,一次
    START
    下一次
    START
    -那么,你想要的是grep?“START | END”是文本模式。我喜欢grep“开始脚本”和“Fin脚本”。我尝试了sysntax,同样的情况也发生了。但是我知道我认为问题是另一个。对不起,“主要工作”是调试中的一句话。开始和结束是“星脚本”和“结束脚本”对不起,更改文本。我试图添加,但我必须从行中删除个性化数据,因此我必须稍后编辑行
    26.09.2014 20:38:51 |       start script > load_stats.sh
    26.09.2014 20:39:23 |       fin Main-Job > load_stats.sh
    
    sed -nE '/(start script|fin Main-Job)/p'