如何使用 grep 过滤执行日志?

如何使用 grep 过滤执行日志?

我运行一个脚本,使用 Rclone 将文件从我的 HDD 移动到 Google Drive,如下所示:

#!/bin/bash
exec 1>> /home/user/MoveLog.txt
exec 2>&1
rclone move localfolder remotefolder:

好的。所以 rclone 在运行时会显示大量终端活动,从而使日志变得相当大。

我想要做的是在创建的日志中过滤这个输出。

我想要一个看起来像输出的日志:

cat MoveLog.txt | grep Copied

因为此命令仅返回日志中比较重要的部分。

我如何在第一个脚本上实现这一点,使其仅记录其中包含文本“Copied”的行?谢谢。

答案1

这似乎太复杂了,怎么样

#!/bin/bash
rclone move localfolder remotefolder: |& \
    tee -a "$HOME/MoveLogEntire.txt" | \
    grep "Copied" >> "$HOME/MoveLog.txt"

我建议在日志为空时保存整个日志以供诊断$HOME/MoveLog.txt

我已将代码更改为将 ( tee -a, >>) 附加到日志中。我已经学会了担心不断增长的文件(不监控可用空间),所以我必须不推荐这种解决方案。

答案2

如果你想保留脚本的现有结构/样式,你可以这样做

#!/bin/bash

exec 1> >(tee -a $HOME/MoveLog.txt | grep 'Copied' >> $HOME/CopiedLog.txt)
exec 2>&1

这将stdout文件描述符 #1 重定向到流程替代,我们首先将其附加到主日志文件$HOME/MoveLog.txt,然后使用teegrep 过滤 d 流并将其附加到辅助日志$HOME/CopiedLog.txt

因为这是一个 bash 脚本,所以您可以替换第一个1>&>省略单独的exec 2>&1重定向。

答案3

似乎您想要过滤 stdout 和 stderr 的输出并将其附加到日志文件:

rclone move localfolder remotefolder &> /dev/stdout | grep Copied >> /home/user/MoveLog.txt

应该可以做你想做的事。我认为你在 -command 中使用的冒号rclone不应该出现在那里,所以我把它省略了,但这一点我可能错了。

相关内容