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

时间:2012-08-30 17:26:41

标签: bash logging

通常我会在我的服务器上运行的进程使用类似的东西

./runEvilProcess.sh >> ./evilProcess.log

但是我现在正在使用Doxygen并且它会产生大量重复输出

示例输出:

QGDict::hashAsciiKey: Invalid null key
QGDict::hashAsciiKey: Invalid null key
QGDict::hashAsciiKey: Invalid null key

所以你最终会得到一个非常混乱的日志

有没有办法我只能将该行添加到日志文件如果该行不是最后添加的行。

一个糟糕的例子(但不确定如何在bash中做)

$previousLine = ""
$outputLine = getNextLine()
if($previousLine != $outputLine) {
  $outputLine >> logfile.log
  $previousLine = $outputLine
}

2 个答案:

答案 0 :(得分:5)

如果流程连续返回重复行,请通过uniq管道流程输出:

 $ ./t.sh 
one
one
two
two
two
one
one
 $ ./t.sh | uniq
one
two
one

如果将日志发送到标准错误流,您还需要重定向:

 $ ./yourprog 2>&1 | uniq >> logfile

(如果重复项来自程序的多次运行,这将无济于事 - 但在审核时,您可以通过uniq管道日志文件。)

答案 1 :(得分:3)

创建过滤器脚本(filter.sh):

while read line; do
  if [ "$last" != "$line" ]; then
    echo $line
    last=$line
  fi  
done

并使用它:

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