![仅在出现错误时格式化日志以添加一些行](https://linux22.com/image/116908/%E4%BB%85%E5%9C%A8%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF%E6%97%B6%E6%A0%BC%E5%BC%8F%E5%8C%96%E6%97%A5%E5%BF%97%E4%BB%A5%E6%B7%BB%E5%8A%A0%E4%B8%80%E4%BA%9B%E8%A1%8C.png)
我正在查找以获取一些像这样的文件,并将输出获取到文件中并将错误发送到不同的日志文件。
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)stdout
和output.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
解释:
- 该
find
部分与之前的变体相同。 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