如果不是重复行,则Bash添加到文件末尾(>;)

如果不是重复行,则Bash添加到文件末尾(>;),bash,logging,Bash,Logging,通常情况下,我在服务器上运行的进程都会使用类似的方法 ./runEvilProcess.sh >> ./evilProcess.log 但是,我目前使用的是Doxygen,它会产生大量重复输出 示例输出: QGDict::hashAsciiKey: Invalid null key QGDict::hashAsciiKey: Invalid null key QGDict::hashAsciiKey: Invalid null key 所以你的日志很乱 如果该行不是最后添加的,是

通常情况下,我在服务器上运行的进程都会使用类似的方法

./runEvilProcess.sh >> ./evilProcess.log
但是,我目前使用的是Doxygen,它会产生大量重复输出

示例输出:

QGDict::hashAsciiKey: Invalid null key
QGDict::hashAsciiKey: Invalid null key
QGDict::hashAsciiKey: Invalid null key
所以你的日志很乱

如果该行不是最后添加的,是否有办法将该行添加到日志文件

一个糟糕的示例(但不确定如何在bash中执行)


如果流程返回一行重复的行,则通过
uniq
管道输出流程:

 $ ./t.sh 
one
one
two
two
two
one
one
 $ ./t.sh | uniq
one
two
one
如果日志被发送到标准错误流,您也需要重定向该错误流:

 $ ./yourprog 2>&1 | uniq >> logfile
(如果重复项来自程序的多次运行,这将不会有帮助,但在查看日志文件时,您可以通过管道将日志文件传递到
uniq

创建一个筛选脚本(
filter.sh
):

并使用它:

./runEvilProcess.sh | sh filter.sh >> evillog

尝试过,但这没有帮助,仍然将负载发送到控制台在您的问题中没有提到任何关于发送到控制台的内容。如果错误没有重定向到该文件,那么您也需要重定向stderr`。。。2> &1 | uniq>>yourlog`出于某种原因,您是对的,所有调试信息都显示为stderr!
while read line; do
  if [ "$last" != "$line" ]; then
    echo $line
    last=$line
  fi  
done
./runEvilProcess.sh | sh filter.sh >> evillog