仅在出现错误时格式化日志以添加一些行

仅在出现错误时格式化日志以添加一些行

我正在查找以获取一些像这样的文件,并将输出获取到文件中并将错误发送到不同的日志文件。

find /some_dir -maxdepth 1 -mindepth 1 > outputFile.txt 2>>log.txt;

中还有其他日志log.txt。如何在错误前后添加几行(例如 ***** 来识别 find 中的错误)并且仅当 find 命令中有任何错误时才添加。

答案1

添加该non_existent_dir参数是find为了生成错误消息。

带变量

#!/bin/bash

error=$(find . non_existent_dir 2>&1 > output.txt)
if (($?)); then
     printf "%s\n%s\n%s\n" "message before" "$error" "message after" >> log.txt
fi

解释:

  • 2>&1 > output.txt- stderr(数字 2) 重定向到stdout(数字 1)stdoutoutput.txt.

  • $?-find命令退出状态。find 如果所有文件均已成功处理,则以状态 0 退出;如果发生错误,则以大于 0 的状态退出。

无变量

find . non_existent_dir 2>&1 > output.txt | 
  awk 'NR == 1 {print "start message"}
       {print}
       END {if(NR > 0) print "end message"}' >> log.txt

解释:

  1. find部分与之前的变体相同。
  2. awk部分 - 如果输入没有任何行(没有发生错误),则不会打印任何内容。
    • NR == 1 {print "start message"}- 如果是第一行,则打印“开始消息”。
    • {print}- 只需打印所有输入行。
    • END {if(NR > 0) print "end message"}- 在执行结束时检查,是否从输入中获取了任何行(NR- 记录数)?如果是这样,则打印“结束消息”。

答案2

您可以创建一个类似以下的函数:

function append()
{
if [[ -s /tmp/stderr ]]
then 
     {   echo -e '\nText you want like ***\n' >> log.txt
         cat /tmp/stderr >> log.txt;
         rm /tmp/stderr
     }
fi
}

然后按以下方式运行命令:

$ find /some_dir -maxdepth 1 -mindepth 1 > outputFile.txt 2>/tmp/stderr;
$ append

相关内容